當前位置:編程學習大全網 - 編程語言 - 京東面試題 java 動態代理主要怎麽實現的

京東面試題 java 動態代理主要怎麽實現的

在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。

其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。

Proxy

類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現,如下,HelloWorld接口定義的業務方

法,HelloWorldImpl是HelloWorld接口的實現,HelloWorldHandler是InvocationHandler接口實

現。代碼如下:

業務接口:

public interface HelloWorld {

void sayHelloWorld() ;

}

業務接口實現:

public class HelloWorldImpl implements HelloWorld {

public void sayHelloWorld() {

System.out.println("Hello World!");

}

}

InvocationHandler實現,需要在接口方法調用前後加入壹部份處理工作,這裏僅僅在方法調用前後向後臺輸出兩句字符串,其代碼如下:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

//要代理的原始對象

private Object objOriginal;

/**

* 構造函數。

* @param obj 要代理的原始對象。

*/

public HelloWorldHandler(Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//方法調用之前

doBefore();

//調用原始對象的方法

result = method.invoke(this.objOriginal ,args);

//方法調用之後

doAfter();

return result ;

}

private void doBefore() {

System.out.println("before method invoke!");

}

private void doAfter() {

System.out.println("after method invoke!");

}

}

測試代碼:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {

HelloWorld hw = new HelloWorldImpl();

InvocationHandler handler = new HelloWorldHandler(hw);

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

hw.getClass().getClassLoader(),

hw.getClass().getInterfaces(),

handler);

proxy.sayHelloWorld();

}

}

首先獲取壹個業務接口的實現對象;

獲取壹個InvocationHandler實現,此處是HelloWorldHandler對象;

創建動態代理對象;

通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前後輸出兩句字符串。

運行測試類輸出如下:

before method invoke!

Hello World!

after method invoke!

此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP

  • 上一篇:中班美術教案:甜甜圈
  • 下一篇:5位數學家的簡介與主要成果
  • copyright 2024編程學習大全網