11111111111111111111111111111111
22222222222222222222222222222222
555555555555555555555555555
333333333333333333333333333333333
JDK动态代理:
proxy.newProxcyInstance(class.getlClassLoder(),class.getinterface(),h);
他是在运行生成的class
该class需要实现一组interface
使用动态代理类时,必须实现InvaocationHandler接口
实现invocationHandler接口
invoke(Object proxy,Method method,Object[] args)
proxy:被代理对象
method:被代理对象的方法
args:方法的参数
ppt上关于proxy的注释写错了,写成了代理类。
动态代理实现步骤
动态代理原理
动态代理实现
个参数含义
代理模式-动态代理图
动态代理实现步骤:
创建实现InvocationHandler的类,必须实现invoke方法
创建被代理的类以及接口
调用Proxy的静态方法,创建一个代理类:newProxyInstance
通过代理调用方法
问题:这里是Car需要代理来实现时间和日志的处理,如果有一个火车,那么还需要增加一个火车时间处理的代理类。不同的类实现这个代理能不能组合成一个代理呢?
动态代理概念:动态产生代理,实现对不同类,不同方法的代理。
JDK动态代理实现方式:在ProxySubject代理类和RealSubject被代理类之间增加了一个实现了InvocationHandler的一个ProxyHandler类(事物处理器),日志处理和时间处理都是在事物处理中完成的。
其中Java动态代理类(InvocationHandler)位于位于java.lang.reflect包下,一般主要涉及到以下两个类:
(1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(Object obj,Method method,Object[] args)在实际使用时,第一个参数表示被代理的对象,第二个参数代表被代理的方法,第三个参数代表被代理方法的参数,args是一个数组。这个抽象方法在代理类中动态实现。
(2)Proxy:产生动态代理的类,通过static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)就可以动态返回代理类的一个实例,返回后的代理类可以当做被代理类使用(可使用被代理类的在接口中声明过的方法)。第一个参数是被代理类的类加载器。第二个参数是被代理类实现了哪些接口。第三个参数是事件处理器。
代码实现:
【步骤1】由于要使用Proxy类动态生成代理的方法中第三个参数需要传入事物处理器的对象。首先需要创建事物处理器。如下图,由于invoke方法中使用到被代理对象,所以构造方法中传入被代理对象的实例,invoke方法中就是为了实现代理功能,通过method.invoke(被代理的对象),这样被代理对象的方法就会执行了。
【步骤2】通过产生动态代理的Proxy类的newProxyInstance方法可以产生代理,第一个参数为被代理对象的类加载器,第二个参数为被代理对象实现的接口,第三个参数为事物处理器。
总结:
JDK动态代理是被代理类首先需要实现某些接口,这个代理在运行时产生代理对象,但该代理并不能做任何操作,操作是通过实现InvocationHandler接口的事物处理器实现的。
Car car = new Car(); Class<?> cls = car.getClass(); InvocationHandler timeHandler = new TimeHandler(car); Moveable timeMoveable = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), timeHandler); InvocationHandler logHandler = new LogHandler(timeMoveable); Moveable logMoveable = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), logHandler); logMoveable.move();
@设计模式——代理模式——了解JDK动态代理 一、JDK动态代理 1、目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2、java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(obj,method,args):实际使用中,obj指被代理类的对象,method指被代理的方法,args为该方法参数数组。这个抽象方法在代理类中动态实现 (2)Proxy:该类即为动态代理类:static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以被当作代理类使用(可使用被代理类的在【接口中】声明过的方法)。 · 第一个参数loader为被代理类的加载器,通过被代理类.getClass().getClassLoader()得到 · 第二个参数interfaces为被代理类实现的所有接口,同样通过getClass().getInterface()得到 · 第三个参数handler就是自己实现的InvocationHandler的实现类的对象 3、***实现: · 声明一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) · 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); · 通过动态代理对象m,代用其方法i.fun();
@设计模式——代理模式——了解JDK动态代理 一、JDK动态代理 1、目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2、java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(obj,method,args):实际使用中,obj指被代理类的对象,method指被代理的方法,args为该方法参数数组。这个抽象方法在代理类中动态实现 (2)Proxy:该类即为动态代理类:static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以被当作代理类使用(可使用被代理类的在【接口中】声明过的方法)。 · 第一个参数loader为被代理类的加载器,通过被代理类.getClass().getClassLoader()得到 · 第二个参数interfaces为被代理类实现的所有接口,同样通过getClass().getInterface()得到 · 第三个参数handler就是自己实现的InvocationHandler的实现类的对象 3、***实现: · 声明一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) · 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); · 通过动态代理对象m,代用其方法i.fun();
111111
代理模式-动态代理图
jdk动态代理
jdk动态代理
jdk动态代理
三、JDK动态代理
1、动态代理的概念:动态产生代理,实现对不同类和不同方法的代理。
2、JDK动态代理:
a、创建事务处理器,实现InvocationHandler接口,覆写invoke方法
invoke(Object proxy,Method method,Object[] args)
参数说明:
proxy 代理对象
Method 被代理对象的方法
args 方法的参数
b、创建被代理的类以及接口
c、调用Proxy的静态方法,创建代理类(这个类是实现了被代理类的接口的)
newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
参数说明:
loader:被代理类的类加载器
interfaces:被代理类实现的接口
h:事务处理器
d、通过代理调用被代理的方法
三、了解JDK动态代理
1、概念:动态产生代理,实现对不同类,不同方法的代理。
动态代理步骤
invocationhandler 转换成自己写的,然后把被代理类传入
@设计模式——代理模式——了解JDK动态代理 一、JDK动态代理 1、目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2、java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(obj,method,args):实际使用中,obj指被代理类的对象,method指被代理的方法,args为该方法参数数组。这个抽象方法在代理类中动态实现 (2)Proxy:该类即为动态代理类:static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以被当作代理类使用(可使用被代理类的在【接口中】声明过的方法)。 · 第一个参数loader为被代理类的加载器,通过被代理类.getClass().getClassLoader()得到 · 第二个参数interfaces为被代理类实现的所有接口,同样通过getClass().getInterface()得到 · 第三个参数handler就是自己实现的InvocationHandler的实现类的对象 3、***实现: · 声明一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) · 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); · 通过动态代理对象m,代用其方法i.fun();