動態,指的是代理類實在程序運行時建立的,而不是在程序運行前手動編碼來定義代理類的。這些動態代理類是在運行時候根據咱們在JAVA代碼中的「指示」動態生成的。動態代理的使用方式呢,主要就是分爲兩種:一種是基於接口的代理;另外一種則是基於類的代理。java
基於接口的代理,就是jdk自帶的動態代理規則的實現方式,後者則是基於一些字節類加強的類代理,如cglib,javassist等。
jdk代理最主要的就是三個類:目標接口,目標類(實現了目標接口),擴展處理器InvocationHandler類。ide
1.建立被代理的接口和類測試
//目標接口
public interface HelloInterfece {
public void sayHello();
}this
//目標類
public class HelloInterfeceImpl implements HelloInterfecr {
@Override
public void sayHello() {
System.out.println("say..hello...");
}
}編碼
//擴展處理器
2.建立代理類實現InvocationHandler 接口
public class HelloProxy implements InvocationHandler {
private Object target;
public HelloProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("----代理前----");
Object result=method.invoke(target,args);
System.out.println("-----代理後----");
return result;
}
}.net
3.編寫測試類
public class HelloProxyTest {代理
public static void main(String[] args) {
//實例化被代理對象
HelloInterfecr helloInterfece = new HelloInterfeceImpl();
//實例化代理對象
HelloProxy helloProxy = new HelloProxy(helloInterfece);
//創建代理關係
HelloInterfecr helloInterfeceImpl = (HelloInterfecr) Proxy.newProxyInstance(helloInterfece.getClass().getClassLoader(), helloInterfece.getClass().getInterfaces(), helloProxy);
//調用方法
helloInterfeceImpl.sayHello();
}
}對象