Java:反射与代理
Java世界的繁荣反射这一特性有很大功劳,可以获取全面的类型信息。
/** * */ package ref; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author hegaofeng * */ public class Invoker { /** * @param args * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException * @throws NoSuchMethodException */ public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { // TODO Auto-generated method stub DatabaseOps ops = (DatabaseOps)Proxy.newProxyInstance( DbOpsWrap.class.getClassLoader(), new Class[]{DatabaseOps.class}, new DbOpsWrap(new DbOpsImpl())); ops.deleteUser(100); ops.listUser(); ValueFields obj = new ValueFields(); System.out.println(obj); Class<?> cv = ValueFields.class; Field a = cv.getDeclaredField("a"); a.setAccessible(true); a.set(obj, 12345); System.out.println(obj); Method m = cv.getDeclaredMethod("show", null); m.setAccessible(true); m.invoke(obj, null); } } class DbOpsImpl implements DatabaseOps { @Override public void listUser() { System.out.println("user listed"); } @Override public void deleteUser(int id) { // TODO Auto-generated method stub System.out.println("user:" + id + " deleted."); } } class ValueFields { private int a = 1; protected int b=2; public String c="name"; private void show() { System.out.println("private method show"); } @Override public String toString() { return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]"; } } class DbOpsWrap implements InvocationHandler { private DbOpsImpl proxied; public DbOpsWrap(DbOpsImpl impl) { proxied = impl; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); return method.invoke(proxied, args); } } interface DatabaseOps{ void listUser(); void deleteUser(int id); }
Class中的
getDeclaredXXX系列函数用于获取定义在该类本层的属性方法(不包括从基类继承得到的)
getXXX系列函数用于获取所有public的属性方法,包括从父类继承得到的,但不含private,protected等非public方法。