JAVA动态代理实现方法,第1张

JAVA动态代理实现方法,第2张

目前的Java开发包包含了对动态代理的支持,但其实现只支持接口的实现。
它的实现主要是通过java.lang.reflect.Proxy类和Java . lang . reflect . invocation handler接口实现的。
Examda提示:Proxy类主要用于获取动态代理对象,InvocationHandler接口用于约束调用者的实现。下面是HelloWorld接口定义的业务方法。HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是Invokation Handler接口的实现。代码如下:
业务接口:
公共接口hello world {
void say hello world();
}
业务接口实现:
公共类hello world实现hello world {
public void say hello world(){
system . out . println(" hello world!");
}
}
调用处理程序的实现需要在接口方法的调用前后增加一些处理工作。这里,只有两个字符串在方法调用前后输出到后台。代码如下:
导入Java . lang . reflect . invocation handler;
导入Java . lang . reflect . method;
公共类hello world handler实现调用处理程序{
/要表示的原始对象
私有对象objOriginal
/**
*构造函数。
* @ param obj exmoda提示:要代理的原始对象。
*/
public hello world handler(Object obj){
this . obj original = obj;
}
公共对象调用(对象代理、方法方法、对象[]参数)
throws Throwable {
对象结果;
//在调用方法之前
doBefore();
//调用原对象的方法
result = method . invoke(this . obj original,args);
//方法被调用后
do After();
返回结果;
}
private void doBefore(){
system . out . println("在方法调用之前!");
}
private void do after(){
system . out . println("方法调用后!");
}
}
测试代码:
import Java . lang . reflect . invocation handler;
导入Java . lang . reflect . proxy;
public class Test {
public static void main(String[]args){
hello world HW = new HelloWorldImpl();
invocation handler handler = new hello world handler(HW);
hello world proxy =(hello world)proxy . new proxy instance(
HW . get class()。getClassLoader(),
hw.getClass()。getInterfaces(),
handler);
proxy . sayhello world();
}
}
& OS lash;首先,获取业务接口的实现对象;
& OS lash;获取一个InvocationHandler实现,这里是HelloWorldHandler对象;
& OS lash;创建动态代理对象;
& OS lash;通过动态代理对象调用sayHelloWorld()方法,会在原对象hello world impl . say hello world()的方法前后输出两个字符串。
运行测试类的输出如下:
在方法调用之前!
你好世界!
在方法调用之后!
这里的测试类有很多方法调用代码。在我们的实际应用中,可以通过配置文件来简化客户端的调用实现。另外,简单的AOP可以通过动态代理来实现。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » JAVA动态代理实现方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情