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动态代理深度学习,
一相关类及其方法。
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();