动态代理举例及详细解析

来源:互联网 发布:手机管理淘宝店铺 编辑:程序博客网 时间:2024/05/21 18:50

动态代理,

         1)代理对象,不需要实现接口;

         2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);

         3)  动态代理, JDK代理, 接口代理;

 

JDK中生成代理对象的API:

|-- Proxy

         staticObject newProxyInstance(

ClassLoader loader,       指定当前目标对象使用类加载器

 Class<?>[] interfaces,     目标对象实现的接口的类型

InvocationHandler h       事件处理器


动态代理总结:

         代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
         (class  $Proxy0 implements IuserDao)


下面是一个具体的案例

1.UserDao

package cn.itcast.b_dynamic;public class UserDao implements IUserDao{@Overridepublic void save() {System.out.println("--已经保存数据--");}}

2.IUserDao

package cn.itcast.b_dynamic;//接口public interface IUserDao {void save();}

3.ProxyFactory

package cn.itcast.b_dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 给所有的dao创建代理对象【动态代理】 *  * 代理对象,不需要实现接口 * @author Jie.Yuan * */public class ProxyFactory{// 维护一个目标对象private Object target;public ProxyFactory(Object target) {super();this.target = target;}// 给目标对象,生成代理对象  public Object getProxyInstance(){return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable {System.out.println("开启事物。。。。");// 执行目标对象方法Object returnValue=method.invoke(target,args);System.out.println("提交事物。。。");return returnValue;}});}}

5.Junit

package cn.itcast.b_dynamic;public class App {public static void main(String[] args){// 目标对象IUserDao target=new UserDao();// 【原始的类型 class cn.itcast.b_dynamic.UserDao】System.out.println(target.getClass());// 给目标对象,创建代理对象IUserDao proxy=(IUserDao) new ProxyFactory(target).getProxyInstance();System.out.println(proxy.getClass());// 执行方法   【代理对象】proxy.save();}}


0 0