反射和動態代理是什麼?java
反射是java提供的一種自省能力,能夠在運行時建立類的實例,訪問成員變量,方法。框架
動態代理是程序在運行時構建代理對象動態動用方法。ide
反射和動態代理是第三方框架進行封裝的基礎。性能
程序提供的一種自省能力,能夠在運行時操做類和對象。this
提供的核心類以下:3d
Class: 獲取類的定義代理
Field : 獲取申明的屬性code
Method: 獲取申明的方法對象
Constructor : 構造新對象blog
須要注意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的使用:
本節介紹了反射,動態代理的細節。以及常見的應用場景。
原創不易,轉載請註明出處。