如何在JD.COM面试题中实现java动态代理?
它的实现主要是通过java.lang.reflect.Proxy类和java。lang.reflect.invocationhandler接口。
代理人
类主要用于获取动态代理对象,InvocationHandler接口用于约束调用者的实现,如下,HelloWorld接口定义的业务端。
方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是InvocationHandler的接口。
现在。代码如下:
业务接口:
公共接口HelloWorld {
void sayHelloWorld();
}
业务接口实现:
公共类HelloWorldImpl实现HelloWorld {
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
要实现InvocationHandler,需要在接口方法调用前后增加一些处理工作。这里只在方法调用前后向后台输出两个字符串,代码如下:
导入Java . lang . reflect . invocation handler;
导入Java . lang . reflect . method;
公共类HelloWorldHandler实现InvocationHandler {
//要代理的原始对象
私有对象objOriginal
/**
*构造函数。
* @param obj要代理的原始对象。
*/
public hello world handler(Object obj){
this.objOriginal = obj
}
公共对象调用(对象代理、方法方法、对象[]参数)
可投掷的
对象结果;
//在方法调用之前
doBefore();
//调用原始对象的方法
result = method . invoke(this . obj original,args);
//在方法调用之后
do after();
返回结果;
}
私有void doBefore() {
System.out.println("方法调用之前!");
}
私有void doAfter() {
方法调用后!);
}
}
测试代码:
导入Java . lang . reflect . invocation handler;
导入Java . lang . reflect . proxy;
公共类测试{
公共静态void main(String[] args) {
hello world HW = new hello world impl();
invocation handler = new hello world handler(HW);
hello world proxy =(hello world)proxy . new proxy instance(
hw.getClass()。getClassLoader(),
hw.getClass()。getInterfaces(),
处理者);
proxy . sayhello world();
}
}
首先,获取业务接口的实现对象;
获取一个InvocationHandler实现,这里是HelloWorldHandler对象;
创建动态代理对象;
通过动态代理对象调用sayHelloWorld()方法,原对象HelloWorldImpl前后会输出两个字符串。sayHelloWorld()方法。
运行测试类输出,如下所示:
在方法调用之前!
你好世界!
在方法调用之后!
这里的测试类中有很多方法调用代码。在我们的实际应用中,可以通过配置文件来简化客户端的调用实现。另外,简单的AOP也可以通过动态代理来实现。