0
点赞
收藏
分享

微信扫一扫

Java的动态代理详细介绍(反射的应用)


Java的动态代理详细介绍(反射的应用)

Java的动态代理详细介绍(反射的应用)_java


Java的动态代理详细介绍(反射的应用)_调用方法_02

Java的动态代理详细介绍(反射的应用)_调用方法_03


先讲一下静态代理的梨子:

接口:

Java的动态代理详细介绍(反射的应用)_调用方法_04

代理类:

Java的动态代理详细介绍(反射的应用)_ide_05


被代理类:

Java的动态代理详细介绍(反射的应用)_代理类_06


测试类:

Java的动态代理详细介绍(反射的应用)_调用方法_07


运行结果图:

Java的动态代理详细介绍(反射的应用)_ide_08


静态代理的代码:

Java的动态代理详细介绍(反射的应用)_代理类_09

接口:
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();
}
}

写动态代理的例子:

肯定是代理类是动态的,代理类需要根据运行时确定被代理类,才能相应创建对应的代理类的对象。

先编写接口和被代理类

Java的动态代理详细介绍(反射的应用)_ide_10


Java的动态代理详细介绍(反射的应用)_java_11


Java的动态代理详细介绍(反射的应用)_调用方法_12


Java的动态代理详细介绍(反射的应用)_调用方法_13


Java的动态代理详细介绍(反射的应用)_代理类_14


Java的动态代理详细介绍(反射的应用)_ide_15


Java的动态代理详细介绍(反射的应用)_ide_16


Java的动态代理详细介绍(反射的应用)_调用方法_17


Java的动态代理详细介绍(反射的应用)_ide_18


参数三是一个接口,主要用于解决问题二,通过代理类调用方法会帮我们动态调用被代理类的同名方法。既然它需要一个接口的实现类作为参数,那我们就自定义一个类来实现这个接口InvocationHandler

Java的动态代理详细介绍(反射的应用)_代理类_19


其中这里面需要实现方法invoke()

当我们通过代理类的对象调用方法时,jvm会自动的帮我们调用invoke()

Java的动态代理详细介绍(反射的应用)_代理类_20


Java的动态代理详细介绍(反射的应用)_java_21


Java的动态代理详细介绍(反射的应用)_java_22


Java的动态代理详细介绍(反射的应用)_ide_23


Java的动态代理详细介绍(反射的应用)_代理类_24


Java的动态代理详细介绍(反射的应用)_调用方法_25


Java的动态代理详细介绍(反射的应用)_代理类_26


Java的动态代理详细介绍(反射的应用)_代理类_27


Java的动态代理详细介绍(反射的应用)_代理类_28


Java的动态代理详细介绍(反射的应用)_java_29

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);
}
});
}
}


举报

相关推荐

0 条评论