Dynamic Proxy (动态代理)
- - CSDN博客推荐文章动态代理主要有一个 Proxy类 和一个 InvocationHandler接口. 真实主题角色(实现了抽象主题接口). 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法). Proxy 要调用 newProxyInstance方法. 1.抽象主题角色 SubjectDemo.java.
动态代理主要有一个 Proxy类 和一个 InvocationHandler接口
动态代理角色:
1. 抽象主题角色
2. 真实主题角色(实现了抽象主题接口)
3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)
Proxy 要调用 newProxyInstance方法
代码演示:
1.抽象主题角色 SubjectDemo.java
package com.dynamicproxy ; public interface SubjectDemo { public void request() ; }
2. 真实主题角色 RealSubjectDemo.java
package com.dynamicproxy ; public class RealSubjectDemo implements SubjectDemo { public void request() { System.out.println("实现了某请求") ; } }
3. 动态代理主题角色 DynamicProxySubjectDemo.java
package com.dynamicproxy ; import java.lang.reflect.InvocationHandler ; import java.lang.reflect.Method ; public class DynamicProxySubjectDemo implements InvocationHandler { private Object sub ; public DynamicProxySubjectDemo(Object obj) { this.sub = obj ; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"+method) ; method.invoke(sub, args) ;//真实的调用方法操作 System.out.println("after"+method) ; return null ; } }
4.客户端 Client.java
package com.dynamicproxy ; import java.lang.reflect.InvocationHandler ; import java.lang.reflect.Proxy ; public class Client { public static void main(String[] args) { RealSubjectDemo rsd = new RealSubjectDemo() ; InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ; Class<?> classType = handler.getClass() ; // classType.getClassLoader() 动态代理类的类加载器 //rsd.getClass().getInterfaces() 代理类要实现的接口列表 //handler 指派方法调用的调用处理程序 SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ; //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd) //执行invoke方法 sd.request() ; } }