public interface Target {
public void doSomething();
}
public class TargetImpl implements Target {
@Override
public void doSomething() {
System.out.println("doSomething 方法开始执行----");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationhandler implements InvocationHandler {
private Target target;
public MyInvocationhandler(Target target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始处理-----");
Object result = method.invoke(target, args);
System.out.println("处理完成-----");
return result;
}
}
public static void main(String[] args) {
Target target = (Target) Proxy.newProxyInstance(TargetImpl.class.getClassLoader(),
TargetImpl.class.getInterfaces(), new MyInvocationhandler(new TargetImpl()));
target.doSomething();
}
输出结果:
开始处理-----
doSomething 方法开始执行----
处理完成-----
动态代理的原理:
动态代理和普通的代理模式的区别,就是动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用Java反射功能动态生成的。和java.lang.reflect.InvocationHandler结合,可以加强现有类的方法实现。如图2,图中的自定义Handler实现InvocationHandler接口,自定义Handler实例化时,将实现类传入自定义Handler对象。自定义Handler需要实现invoke方法,该方法可以使用Java反射调用实现类的实现的方法,同时当然可以实现其他功能,例如在调用实现类方法前后加入Log。而Proxy类根据Handler和需要代理的接口动态生成一个接口实现类的对象。当用户调用这个动态生成的实现类时,实际上是调用了自定义Handler的invoke方法。
本文介绍Java动态代理的实现原理及应用。通过自定义InvocationHandler接口的实现类,可以在不修改原有类的基础上增强其功能,例如添加日志记录等。利用Proxy类动态生成实现了指定接口的代理对象。

被折叠的 条评论
为什么被折叠?



