SSH前言 - 動態代理的簡單實現
阿新 • • 發佈:2020-12-07
技術標籤:Struts2+Spring+Hibernatessh反射動態代理
動態代理:程式執行後代理類與目標類之間的代理關係隨之確定,動態代理一般僅具備代理物件。
介面類:
/**
* 主業務介面:本介面中的方法將會被代理增強
* @author WanAkiko
*
*/
public interface ISomeService {
String doFirst();
void doSecond();
}
介面實現類:
import service.ISomeService; /** * 目標類:本類將會被代理類增強 * @author WanAkiko * */ public class SomeServiceImpl implements ISomeService { @Override public String doFirst() { System.out.println("執行目標類的doFirst方法!"); return "WanAkiko"; } @Override public void doSecond() { System.out.println("執行目標類的doSecond方法!"); } }
功能測試類(此處動態代理僅具備代理物件而不具備具體的代理類):
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import service.ISomeService; import service.impl.SomeServiceImpl; /** * 功能測試類 * * @author WanAkiko * */ public class DynamicProxyTest { public static void main(String[] args) { final ISomeService target = new SomeServiceImpl(); // 主業務介面例項化靜態代理類 /** * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) * 返回一個指定介面的代理類例項(動態代理物件),該介面可以將方法呼叫指派到指定的呼叫處理程式 */ ISomeService service = (ISomeService) Proxy.newProxyInstance( target.getClass().getClassLoader(), // 獲取目標類的類載入器 target.getClass().getInterfaces(), // 獲取目標類實現的所有介面 new InvocationHandler() { // 建立InvocationHandler匿名內部類 /** * Object proxy:代理物件 * Method method:需要增強的目標方法 * Object[] args:目標方法的引數列表 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target, args); if (null != result) { ((String) result).toUpperCase(); } return result; } }); String result = service.doFirst(); System.out.println(result); // 此處doSecond()在程式執行時執行到invoke()後會丟擲空指標異常,原因是該方法沒有返回值 service.doSecond(); } }
執行示例: