面試刷題6:反射和動態代理是什麼?
阿新 • • 發佈:2020-03-24
反射和動態代理是什麼?
反射是java提供的一種自省能力,可以在執行時建立類的例項,訪問成員變數,方法。
動態代理是程式在執行時構建代理物件動態動用方法。
反射和動態代理是第三方框架進行封裝的基礎。
反射
程式提供的一種自省能力,可以在執行時操作類和物件。
提供的核心類如下:
Class: 獲取類的定義
Field : 獲取申明的屬性
Method: 獲取申明的方法
Constructor : 構造新物件
需要注意setAccessble(Boolean)方法;
可以修改反射的相關物件的訪問控制權限;
比如:
ORM框架自動生成set,get方法;
某些API的private成員和方法的操作,定製API的功能;
動態代理
執行時自動構建代理,處理方法呼叫;
實現方式有: jdkProxy, cglib;
對比專案 | 說明 |
---|---|
JdkProxy | 1.程式碼簡單 2,無額外依賴 3,可以跟隨jdk平滑升級 |
Cglib | 1,效能優 2,不用實現額外介面 3,只關心操作的類 |
常見應用:RPC呼叫,AOP
下面的程式碼是使用jdkProxy的例子:
public class MyDynamicProxy { public static void main (String[] args) { HelloImpl hello = new HelloImpl(); MyInvocationHandler handler = new MyInvocationHandler(hello); // 構造程式碼例項 Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler); // 呼叫代理方法 proxyHello.sayHello(); } } interface Hello { void sayHello(); } class HelloImpl implements Hello { @Override public void sayHello() { System.out.println("Hello World"); } } class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Invoking sayHello"); Object result = method.invoke(target, args); return result; } }
aop的使用:
小結
本節介紹了反射,動態代理的細節。以及常見的應用場景。
原創不易,轉載請註明出處。