首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Java 靜態代理與動態代理深度解析

     編輯:關於C++

代理模式核心概念

代理模式的核心優勢在於隱藏真實類(委托類),提高安全性。靜態代理與動態代理的本質區別在於代理類的生成時機:

  • 靜態代理:代理類由程序員編寫,編譯期就存在
  • 動態代理:運行時通過反射動態生成,更加靈活

UML 類圖說明

代理模式UML圖

靜態代理實現

1. 公共接口

public interface ITest {
    void addStudent(String name);
}

2. 委托類

public class Test implements ITest {
    @Override
    public void addStudent(String name) {
        System.out.println("學生姓名:" + name);
        try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}

3. 代理類

public class ProxyTest implements ITest {
    private Test delegate;
    public ProxyTest(Test delegate) { this.delegate = delegate; }
    
    @Override
    public void addStudent(String name) {
        long start = System.currentTimeMillis();
        delegate.addStudent(name);
        long end = System.currentTimeMillis();
        System.out.println("執行任務耗時 " + (end - start) + " 毫秒");
    }
}

4. 工廠與客戶端

public class TestFactory {
    public static ITest getInstance() {
        return new ProxyTest(new Test());
    }
}

public class Client {
    public static void main(String[] args) {
        ITest proxy = TestFactory.getInstance();
        proxy.addStudent("好學生");
    }
}

靜態代理優缺點

優點業務類只關注業務邏輯,保證重用性
缺點1. 一個接口只服務一種類型對象
2. 接口新增方法需修改所有實現類和代理類,維護成本高

動態代理核心 API

java.lang.reflect.Proxy

動態代理類父類,提供靜態方法生成代理類及實例:

  • getInvocationHandler(Object proxy)
  • getProxyClass(ClassLoader loader, Class[] interfaces)
  • isProxyClass(Class cl)
  • newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

InvocationHandler 接口

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

集中處理動態代理對象上的所有方法調用,通常實現委托類的代理訪問。

ClassLoader 類裝載器

負責將動態生成的字節碼裝載到 JVM,與普通類區別在於字節碼運行時生成而非預存 .class 文件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved