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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值