动态代理(运行期行为)主要有一个 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() ;
}
}