Java動態代理再理解
阿新 • • 發佈:2019-01-02
這是我理解的動態代理的原理圖:
動態代理例項:
public class TestProxy { public static void main(String[] args) { //被代理物件 RealSubject rs = new RealSubject(); //建立一個實現了InvocationHandler 的代理類物件 MyInvocationHandler myInvocationHandler = new MyInvocationHandler(rs); //建立被代理物件(結合原理圖,可以理解,動態生成的位元組碼需要類載入器重新載入才可以生成Java相關物件) Object obj = Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), myInvocationHandler); Subject subject = (Subject) obj; //通過反射執行被代理類的相關方法(並新增相應的附加業務邏輯) subject.action(); } } interface Subject{ void action(); } class RealSubject implements Subject{ @Override public void action() { System.out.println("我是被代理類"); } } //動態代理類(凡是很動態代理相關的都與這個InvocationHandler介面有關係) class MyInvocationHandler implements InvocationHandler{ Object obj; public MyInvocationHandler(Object obj) { this.obj = obj; } //當通過代理類物件發起對被重寫的被代理類的方法進行呼叫的時候,都會轉化成如下的invoke()方法的呼叫 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //method 方法的返回值是 returnValue System.out.println("代理類執行之前,所呼叫的方法名是:"+method.getName()+"的方法的執行"); Object returnValue = method.invoke(obj, args); return returnValue; } }