如何在JD.COM面试题中实现java动态代理?

目前的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也可以通过动态代理来实现。