哈哈,楼主,你好,我也是今天才弄明白的,我来说说自己的见解:
package com.danamic1;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public abstract class ProxyTest {
/**
* @param args
*/
public static void main(String[] args) {
//被代理的对象的字节码
HelloImp1 obj=new HelloImp1();
Class clazz=obj.getClass();
//LogHandler handler=new LogHandler(imp1);
//Hello hello=(Hello)Proxy.newProxyInstance(clazz.getClassLoader(),
//clazz.getInterfaces(), new LogHandler(obj));
//传递三个参数:第一个是被代理对象的类加载器,被代理对象所实现的接口,以及一个实现了接口InvocationHandler的类
//当Client需要调用被代理对象中的方法时,这些方法就是是实现了getInterfaces(),此时我们是对代理对象调用的这些方法
//,代理对象相关联的InvocationHandler的实现类的invoke方法,即我们是实现了的
//public Object invoke(Object proxy, Method method, Object[] args)
//我们可以在invoke方法中是实现我们要的逻辑,包括调用被代理对象的方法,
//method.invoke(targetObject,args),targetobject为被代理对象,被代理对象是
//作为InvocationHandler实现类的成员变量,args是要传递的参数
//还可以在调用被代理对象相关方法之前和之后添加某些操作,
//当我们对代理对象执行某些操作时,这些操作和被代理对象操作一样,其实我们本意也是对代理对象的某些操作,
//在本例中,我们是要使用被代理对象的print和sayhello方法,但是我们调用的却是代理对象,同时还可以执行dobefore
//和doafter方法,对被代理对象进行包装
Hello hello=(Hello)Proxy.newProxyInstance(clazz.getClassLoader(),
clazz.getInterfaces(), new LogHandler(obj));
hello.print("洁");
System.out.println("**************************************");
hello.sayHello("宝贝你好");
}
}
package com.danamic1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
doBefore();
System.out.println("method:"+method.getName());
for(Object obj:args)
System.out.println("args:"+(String)obj);
method.invoke(target, args);
doAfter();
return null;
}
private void doBefore(){
System.out.println("before.......");
}
private void doAfter(){
System.out.println("after........");
}
}
楼主,还有一个接口和一个现实接口的类,这里就不讲了,要是不懂,可以再问我,我弄了两天才明白的。上面的注解和代码很详细了!
希望对你有帮助!
|