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方法。