JDK动态代理----基于接口实现
动态代理依赖的类
动态代理是jdk的技术,在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。
InvocationHandler 用于表示在执行某个方法之前、之后你想加入什么代码,这个是真正在干活的类
用于自动生成代理类,InvocationHandler的子类将会作为Proxy的一个参数来生成代理类。
两者如何关联上的?
通过Proxy.newInstance()方法,invocationHandler会作为参数传入Proxy, 由Proxy在编译的时候加工自动生成代理类,这个生成的代理类里就会有invocationHandler里指定的要执行的代码
代理类的作用?
代理类的工作就是把实体类接过来,然后调用它的方法,也就是说本来实体类可以自己执行的方法现在由代理类来触发执行,这样做的好处是,在调用实体类方法的前后我们可以插入监控方法
public class ProxyDemo {
public static void main(String[] args) {
//创建一个实例对象,这个对象就是被代理的对象
IDog dog = new GunDog();
/**
* 创建一个与代理对象相关联的invocationHandler对象的子类
* 并通过它来创建一个代理对象,代理对象被调用后,每个执行方法都会替换执行Invocation中的invoke * 方法
* 可以通过反编译生成的代理类来验证
*/
IDog proxy = (IDog)MyProxyFactory.getProxy(dog);
//调用代理类的执行方法
proxy.run();
//生成代理类的字节码,并将其写入本地磁盘的class文件中
byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0", GunDog.class.getInterfaces());
String path = "C:\\Users\\liss\\IdeaProjects\\Java-Proxy\\src\\com\\shuai\\DogProxy.class";
try(FileOutputStream fos = new FileOutputStream(path)) {
fos.write(classFile);
fos.flush();
System