JAVA动态代理深度学习

JAVA动态代理深度学习(代理,InvocationHandler的),含元Proxy0源码

JAVA动态代理深度学习,

一相关类及其方法。

java.lang.reflect.Proxy,
代理 是代理实例的调用处理程序









二源代码。

被代理对象的接口及实现类:
com.ml.test包;

公共接口管理器{
公共无效修改();
}

包com.ml.test;

公共类ManagerImpl实现管理{

@覆盖
公共无效修改(){
   (“*******修改()方法扩展功能被调用”);
}
}

业务代理类:
包com.ml.test;

进口java.lang.reflect.InvocationHandler的;
进口java.lang.reflect.Method;

公共类BusinessHandler的实现InvocationHandler的{

私人Object对象= NULL;

公共BusinessHandler(Object对象){
   this.object =对象;
}

@覆盖
公共对象调用(代理对象,方法的方法,对象[]参数)
    抛出的Throwable {
   System.out.println(“前法做什么”);
   对象RET = method.invoke(this.object里,args);
   系统。通过out.println(“后方法”);
   返回RET;


} }



客户端类:的
包com.ml.test;
进口java.lang.reflect.Proxy
公共类客户{

公共静态无效的主要(字符串[]参数){
   / /元对象(被代理对象)
   ManagerImpl managerImpl =新ManagerImpl();

   / /业务代理类
   BusinessHandler securityHandler =新BusinessHandler(managerImpl);

   / /获得代理类($ Proxy0扩展代理实现经理)的实例
   经理managerProxy =(经理)Proxy.newProxyInstance(managerImpl
     。的getClass()getClassLoader(),managerImpl.getClass(),
     。getInterfaces(),securityHandler);

   managerProxy.modify();

} }

三执行结果:
之前的方法做的东西
*******修改()方法被调用
方法后的东西

四机制分析。

代理。(ClassLoader的装载机,类<?> []接口,InvocationHandler的Ĥ)做了以下几件事。
(1)根据参数加载器和接口调用方法getProxyClass(装载机, 代理{    InvocationHandler的H = NULL;    保护代理(InvocationHandler的H){     this.h = H;    }    ... } 下面什么本例的$ Proxy0类的源码(好不容易才把它提出来):














java.lang.reflect.InvocationHandler的进口;
进口java.lang.reflect.Method;
进口java.lang.reflect.Proxy;
进口java.lang.reflect.UndeclaredThrowableException;

公众最后一堂课$ Proxy0扩展代理实现管理{

私有静态方法M1,
M0私人静态方法;
私人静态方法立方米;
私有静态方法M2; 静态{    尝试{     M1 = Class.forName的(“java.lang.Object继承”)getMethod(“等于”。       新的Class [] { Class.forName的(“java.lang.Object继承”)});     M0 = Class.forName的(“java.lang.Object继承”)getMethod(“的hashCode”,       新的类[0]);     M3 = Class.forName的(“ com.ml.test.Manager“)。getMethod(”修改“,       新的类[0]);     M2 = Class.forName的(“java.lang.Object继承”)getMethod(“。的toString”,       新的类[0]) ;    }(NoSuchMethodException nosuchmethodexception){     扔,新NoSuchMethodError(nosuchmethodexception.getMessage());    }的catch(ClassNotFoundException异常ClassNotFoundException异常){     抛出新出现NoClassDefFoundError(classnotfoundexception.getMessage());    } } $ Proxy0(InvocationHandler的InvocationHandler的){    超(InvocationHandler的); }





















@覆盖
公众最终布尔等于(对象obj){
   {
    返回((布尔)super.h.invoke的(这一点,M1,新的对象obj的[] {}))
      booleanValue();
   }的catch(Throwable的抛出){
    扔新UndeclaredThrowableException(抛出);
   }
}

@覆盖
公众最终诠释的hashCode(){     ((整数)super.h.invoke(本),M0,空)的intValue();    }
   {
返回
赶上(抛出的Throwable){
    抛出UndeclaredThrowableException新(抛出);
   }
}

公众最终无效修改(){
   {
    super.h.invoke(这一点,M3,NULL);
    回报;
   }渔获量(误差e){
   }的catch(Throwable的抛出){
    抛出新UndeclaredThrowableException(抛出);
   }
}

@覆盖
公众最终字符串的toString(){
   尝试{
    返回(字符串)super.h.invoke(M2,NULL);
   }捕捞(抛出的Throwable){
    扔新UndeclaredThrowableException(抛出);
   }
}
}

接着把得到的$Proxy0实例强制转换成Manager.
当执行managerProxy.modify()方法时,就调用了$Proxy0类中的modify()方法.
在modify方法中,调用父类Proxy中的h的invoke()方法.
即InvocationHandler.invoke();

你可能感兴趣的:(JAVA动态代理深度学习)