JDK 的动态代理
因为他是基于接口的 我看书上说他其实是如果有接口默认就上JDK动态代理了,我们实现以下:
【听说学个之前要有JDK代理模式的基础 我就不 直接淦就完了!】
什么包都不用导
新建一个目标接口:
package com.bihu;
public interface TargetInterface {
public void method();
}
新建一个目标对象 (被增强) 且 继承目标接口:
package com.bihu;
public class Target implements TargetInterface{
@Override
public void method() {
System.out.println("method Running·····");
}
}
再来一个增强(相当被抽取的那个)方法:
package com.bihu;
public class Enhance {
public void before(){
System.out.println("前置增强...");
}
public void after(){
System.out.println("后置增强...");
}
}
再来一个测试的 即调用类:
package com.bihu;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class AgentTest {
public static void main(String[] args) {
//new 一个 目标对象
final Target target = new Target();
//new 一个 增强对象
final Enhance enhance = new Enhance();
/**
* public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h)
* 三个参数啊:
* 第一个 目标对象类加载器
* 第二个 目标对象相同的接口字节码对象数组
* 第三个 一个接口 下面演示直接用匿名函数
*/
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* 其实调用代理对象任何的方法 实质最后还是执行这个 invoke 方法。
* 这里三个参数, 第一个是proxy -代理实例;第二个是 method代理实例的 方法实例;第三个是 args -包含在方法上通过代理实例调用的实参的值对象的数组,或 null如果接口方法不需要参数
*/
//执行增强方法(前)
enhance.before();
Object invoke = method.invoke(target, args);//执行目标方法
//执行增强方法(后)
enhance.after();
return invoke;
}
});
//调用测试 //主要是这里往里看比较容易懂
proxy.method();
}
}
这里慢慢看 即可看懂,有些没学过 但是呢 道理都一样
作者:咸瑜