Java動態代理

動態代理

能解決什麼問題?

能夠在運行時修改類,這樣能夠用聲明的方式來編程(對別的代碼實現無侵入式編程)。
如:java

  • 給某些方法先後添加日誌記錄;
  • 給某些方法添加事務支持;
  • 給某些函數添加權限;
  • 別人的代碼,只有.class文件,可是須要添加額外的操做;

聲明的方式編程

就是能夠在xml文件或者什麼地方聲明下,便可實現對什麼包或者以service結尾的的類的全部方法先後添加其餘的操做。編程

使用的實例

  • Spring 的AOP
  • 在Spring項目中用的註解,例如依賴注入的@Bean、@Autowired,事務註解@Transactional等都有用到

實現示例

我這就那開發者來舉例吧函數

提供模擬數據訪問層接口

一個開發者的接口測試

/**
 * @since cl @ 2019-06-19 10:26
 * 開發者
 */
public interface Developer {

    void code();

    void debug();
}

實現類

實現一個java開發者的類this

/**
 * @since cl @ 2019-06-19 10:27
 * Java開發者
 */
public class JavaDeveloper implements Developer{

    private String name;

    public JavaDeveloper(String name) {
        this.name = name;
    }

    public void code() {
        System.out.println(name+" doing code...");
    }

    public void debug() {
        System.out.println(name+" doing debug...");
    }
}

代理處理類:處理須要被代理的類該作啥

/**
 * @since cl @ 2019-06-19 10:30
 */
public class JavaDeveloperHandler implements InvocationHandler {

    Object object;

    public JavaDeveloperHandler(Object object) {
        this.object = object;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("聽音樂....");
        method.invoke(object,args);
        System.out.println("打遊戲....");
        return null;
    }

}

測試使用

/**
 * @since cl @ 2019-06-19 14:31
 */
public class DynamicProxyMain {

    public static void main(String[] args) {
        JavaDeveloper tomDeveloper = new JavaDeveloper("Tom");
        JavaDeveloperHandler handler = new JavaDeveloperHandler(tomDeveloper);
        Developer tomDeveloperProxy = (Developer)Proxy.newProxyInstance(tomDeveloper.getClass().getClassLoader(),
                tomDeveloper.getClass().getInterfaces(),handler);

        tomDeveloperProxy.debug();
        tomDeveloperProxy.code();
    }
}

參考

《碼農翻身》-Java帝國之動態代理
https://www.jianshu.com/p/95970b089360
https://www.cnblogs.com/maybo/p/5193843.htmldebug

相關文章
相關標籤/搜索