Java JDK动态代理实现原理实例解析
JDK动态代理实现原理
动态代理机制
通过实现InvocationHandler接口创建自己的调用处理器
通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理类
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
InterfaceInvocationHandler
该接口中仅定义了一个方法Object:invoke(Objectobj,Methodmethod,Object[]args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
Proxy
该类即为动态代理类
ProtectedProxy(InvocationHandlerh)
构造函数,用于给内部的h赋值
StaticClassgetProxyClass(ClassLoaderloader,Class[]interfaces)
获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组
StaticObjectnewProxyInstance(ClassLoaderloader,Class[]interfaces,InvocationHandlerh)
返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)
DynamicProxy
它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个DynamicProxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
代码示例
创建接口:
/**
*@CreateDate:2019/6/1714:52
*@Version:1.0
*/
publicinterfaceBuyService{
StringbuyPhone();
StringbuyComputer();
}
创建实现类:
publicclassBuyServiceImplimplementsBuyService{
@Intercept("buyPhone")
@Override
publicStringbuyPhone(){
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("==========BuyServiceImpl.class============="+"buyPhone");
this.buyComputer();
return"buyphone";
}
@Intercept("buyComputer")
@Override
publicStringbuyComputer(){
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("==========BuyServiceImpl.class============="+"buyComputer");
return"buycomputer";
}
}
创建InvocationHandler:
publicclassReflectionHandlerimplementsInvocationHandler{
privateObjecttarget;
publicReflectionHandler(Objecttarget){
this.target=target;
}
publicTgetProxy(){
return(T)Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
returnmethod.invoke(target,args);
}
}
创建启动类:
publicclassBootstrap{
publicstaticvoidmain(String[]args){
//动态代理实现
ReflectionHandlerreflectionHandler=newReflectionHandler(newBuyServiceImpl());
BuyServiceproxy=reflectionHandler.getProxy();
Stringcomputer=proxy.buyComputer();
Stringphone=proxy.buyPhone();
System.out.println(computer+"\r\n"+phone);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。