动态代理通过实现InvocationHandler接口来实现;
推荐https://www.cnblogs.com/dreamroute/p/5273888.html这篇文章
核心:通过动态代理生成一个代理对象接口的实现类,在该实现类中对应的方法上去调用InvocationHandler上的invoke方法
首先定义被代理对象接口
public interface Subject {
void doSomething();
void doSomething2();
}
实现接口:
public class SubjectImpl implements Subject {
@Override
public void doSomething() {
System.out.println("doSomething");
}
@Override
public void doSomething2() {
System.out.println("方法2.1");
}
}
继承InvocationHandler接口:
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target) {
this.target = target;
}
@SuppressWarnings("unchecked")
public <T> T proxy(){
//动态生成一个实现接口的实现类,在该实现类调用invoke方法
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/*
*什么时候调用到这个方法
* 在动态生成接口实现类中对应的method上调用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置通知");
Object obj = method.invoke(target, args);
System.out.println("后置通知");
return obj;
}
}
调用:
public class Test {
public static void main(String[] args) {
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", true);
//这里返回的的就是动态生成的实现类的实例
Subject subject = new JDKDynamicProxy(new SubjectImpl()).proxy();//动态生成一个实现Subject接口的实现类,在该实现类调用invoke方法;
//调用的是动态生成实现类的实现方法
subject.doSomething2();
try {
proxyTest();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获得动态代理生成的.class文件
* @throws Exception
*/
@SuppressWarnings("resource")
public static void proxyTest() throws Exception {
byte[] bs = ProxyGenerator.generateProxyClass("SubjectImpl", new Class<?>[] {Subject.class});
new FileOutputStream(new File("d:/AudiImpl.class")).write(bs);//在获得动态生成的代理类
}
}