Java的动态代理详细介绍(反射的应用)
先讲一下静态代理的梨子:
接口:
代理类:
被代理类:
测试类:
运行结果图:
静态代理的代码:
接口:
public interface ClothFactory {
void produceCloth();
}
被代理类:
public class NikeClothFactory implements ClothFactory {
@Override
public void produceCloth() {
System.out.println("nike工厂加工衣服");
}
}
代理类:
public class ProxyClothFactory implements ClothFactory{
private ClothFactory clothFactory;
public ProxyClothFactory(ClothFactory clothFactory){
this.clothFactory=clothFactory;
}
@Override
public void produceCloth() {
System.out.println("代理工厂处理衣服准备前事项");
clothFactory.produceCloth();
System.out.println("代理工厂处理衣服收尾工作");
}
}
测试类:
public class ProxyTest {
public static void main(String[] args) {
ClothFactory nikeClothFactory = new NikeClothFactory();
ClothFactory proxyClothFactory = new ProxyClothFactory(nikeClothFactory);
proxyClothFactory.produceCloth();
}
}
写动态代理的例子:
肯定是代理类是动态的,代理类需要根据运行时确定被代理类,才能相应创建对应的代理类的对象。
先编写接口和被代理类
参数三是一个接口,主要用于解决问题二,通过代理类调用方法会帮我们动态调用被代理类的同名方法。既然它需要一个接口的实现类作为参数,那我们就自定义一个类来实现这个接口InvocationHandler
其中这里面需要实现方法invoke()
当我们通过代理类的对象调用方法时,jvm会自动的帮我们调用invoke()
public class ProxyFactory {
public static Object getProxyInstance(Object obj){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(obj,args);
}
});
}
}