JDK动态代理

JDK动态代理

JDK动态代理

 

 

1 public interface DynamicInterface {
2 //定义一个接口
3     void eat();
4 }
1 public class DynamicTarget implements DynamicInterface {
2     @Override      //委托类
3     public void eat() {
4         System.out.println("target目标类" );
5     }
6 }
 1 /**
 2  * JDK动态代理类 实现InvocationHandler接口
 3  * 重写其 invoke 方法(在 invoke 方法中利用反射机制调用委托类的方法,并自定义一些处理逻辑),
 4  * 并将委托类注入处理类
 5  * */
 6 public class DynamicProxy implements InvocationHandler {
 7     // 将委托类注入处理类(这里我们用 Object 代替,方便扩展)
 8     private Object target;
 9 
10     public DynamicProxy(Object target){
11         this.target=target;
12     }
13     // 重写 invoke 方法
14     @Override
15     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16 
17         //在委托类方法前后做增强
18         System.out.println("动态代理之前");
19         method.invoke(this.target,args);
20         System.out.println("动态代理之后");
21 
22         return null;
23     }
24 }
 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4 
 5         //JDK动态代理 使用
 6         //目标对象
 7         DynamicTarget target = new DynamicTarget();
 8         //拦截器
 9         DynamicProxy dynamicProxy = new DynamicProxy(target);
10         DynamicInterface proxyObj = (DynamicInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(),
11                 target.getClass().getInterfaces(), dynamicProxy);
12         proxyObj.eat();
13 
14 }
15 }

输出:

JDK动态代理

 

 总结:

JDK 动态代理是基于实现了接口的委托类,通过接口实现代理,JDK 动态代理只能代理实现了接口的类,且只能增强接口中现有的方法。

 

 

上一篇:40.Linux应用调试-使用gdb和gdbserver


下一篇:深入源码,深度解析Java 线程池的实现原理