JDK 動態代理

0、JDK 動態代理的條件是被代理對象必須實現接口。java

Spring AOP不須要開發人員本身維護代理類,其已幫開發人員生成了代理類。Spring AOP的實現是經過在程序運行時,根據具體的類對象和方法等信息動態地生成了一個代理類的class文件的字節碼,再經過ClassLoader將代理類加載到內存總,最後經過生成的代理對象進行程序的方法調用。ide

一、接口測試

public interface Animal {
    void eat();
}

二、接口實現this

public class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("Dog須要吃骨頭");
    }
}

三、動態代理類,實現 InvocationHandler 接口代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 動態代理類
 */
public class AnimalInvocationHandler implements InvocationHandler {
    /**
     * 被代理對象
     */
    private Object target;

    /**
     * 綁定業務對象並返回一個代理類
     */
    public Object bind(Object target) {
        this.target = target;
        //經過反射機制,建立一個代理類對象實例並返回。用戶進行方法調用時使用
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    /**
     * 接口方法
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=null;
        //方法執行前加一段邏輯
        System.out.println("——————調用前處理——————");
        //調用真正的業務方法
        result=method.invoke(target, args);
        //方法執行前加一段邏輯
        System.out.println("——————調用後處理——————");
        return result;
    }
}

四、測試code

public class JDKDynamicProxyDemo {
    public static void main(String[] args) {
        //被代理對象
        Dog dog = new Dog();
        //動態代理類對象
        AnimalInvocationHandler animalInvocationHandler = new AnimalInvocationHandler();
        //代理對象
        Animal proxy = (Animal) animalInvocationHandler.bind(dog);
        proxy.eat();
    }
}

五、結果對象

——————調用前處理——————
Dog須要吃骨頭
——————調用後處理——————
相關文章
相關標籤/搜索