import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.catalina.tribes.util.Arrays;
import com.inte.testInterface;
public class JDKProxyObject implements InvocationHandler {
private Object target; // 维护目标对象
public JDKProxyObject(Object target){
this.target = target;
}
public static Object factory(Object obj){
Class cls = obj.getClass();
//通过Proxy类的newProxyInstance方法来返回代理对象,返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
//cls.getClassLoader():返回该类的类加载器;cls.getInterfaces():确定此对象所表示的类或接口实现的接口;new ProxyObject(obj):指派方法调用的调用处理程序
return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),new JDKProxyObject(obj));
}
/**
* 接口实现
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("函数调用前被拦截了: " + method);
if(args != null){
//打印参数列表
System.out.println("方法有 " + args.length + " 个参数");
for(int i = 0; i < args.length; i ++){
System.out.println(args[i]);
}
}
//利用反射机制动态调用原对象的方法
Object mo = method.invoke(target, args);
Class<? extends Object> class1 = target.getClass();
Field[] declaredFields = class1.getDeclaredFields();
for(Field f:declaredFields) {
System.out.println(f.getName()+" =============");
}
Method[] declaredMethods = class1.getDeclaredMethods();
for(Method m:declaredMethods) {
//获取方法名及相应的参数列表
System.out.println(m.getName()+" ---------------"+Arrays.toString(m.getParameters()));
}
System.out.println("函数调用后进行处理 : " + method);
return mo;
}
//测试代码
public static void main(String agr[]){
testInterface si = (testInterface)factory(new testInterfaceImpl());
si.show("测试代理");
}
}