標籤:
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 stubDatabaseOps 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 {@Overridepublic void listUser() {System.out.println("user listed");}@Overridepublic void deleteUser(int id) {// TODO Auto-generated method stubSystem.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");}@Overridepublic String toString() {return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]";}}class DbOpsWrap implements InvocationHandler {private DbOpsImpl proxied;public DbOpsWrap(DbOpsImpl impl) {proxied = impl;}@Overridepublic 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方法。
Java:反射與代理