Java动态代理机制分析及扩展,第1部分 - 编程入门网
器为参数的构造函数
public SimulatorProxy(InvocationHandler handler){
this.handler = handler;
}
// 实现接口方法 simulate
public short simulate(int arg1, long arg2, String arg3)
throws ExceptionA, ExceptionB {
// 第一步是获取 simulate 方法的 Method 对象
java.lang.reflect.Method method = null;
try{
method = Simulator.class.getMethod(
"simulate",
new Class[] {int.class, long.class, String.class} );
} catch(Exception e) {
// 异常处理 1(略)
}
// 第二步是调用 handler 的 invoke 方法分派转发方法调用
Object r = null;
try {
r = handler.invoke(this,
method,
// 对于原始类型参数需要进行装箱操作
new Object[] {new Integer(arg1), new Long (arg2), arg3});
}catch(Throwable e) {
// 异常处理 2(略)
}
// 第三步是返回结果(返回类型是原始类型则需要进行拆箱操作 )
return ((Short)r).shortValue();
}
}
Java动态代理机制分析及扩展,第1部分(7)时间:2011-06-21 IBM / 王忠平 何平模拟推演为了突出通用逻辑所以更多地关注正常流程,而淡化了错误处理, 但在实际中错误处理同样非常重要。从以上的推演中我们可以得出一个非常通用 的结构化流程:第一步从代理接口获取被调用的方法对象,第二步分派方法到调 用处理器执行,第三步返回结果。在这之中,所有的信息都是可以已知的,比如 接口名、方法名、参数类型、返回类型以及所需的装箱和拆箱操作,那么既然我 们手工编写是如此,那又有什么理由不相信 ProxyGenerator 不会做类似的实现 呢?至少这是一种比较可能的实现。 接下来让我们把注意力重新回到先前被淡化的错误处理上来。在异常处理 1 处,由于我们有理由确保所有的信息如接口名、方法名和参数类型都准确无误, 所以这部分异常发生的概率基本为零,所以基本可以忽略。而异常处理 2 处, 我们需要思考得更多一些。回想一下,接口方法可能声明支持一个异常列表,而 调用处理器 invoke 方法又可能抛出与接口方法不支持的异常,再回想一下先前 提及的 Java 动态代理的关于异常处理的特点,对于不支持的异常,必须抛 UndeclaredThrowableException 运行时异常。所以通过再次推演,我们可以得 出一个更加清晰的异常处理 2 的情况: 清单 12. 细化的异常处理 2
这样我们就完成了对动态代理类的推演实现。推演实现遵循了一个相对固定 的模式,可以适用于任意定义的任何接口,而且代码生成所需的信息都是可知的 ,那么有理由相信即使是机器自动编写的代码也有可能延续这样的风格,至少可 以保证这是可行的。 美中不足 诚然,Proxy 已经设计得非常优美,但是还是 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |