动态代理举例及详细解析

    xiaoxiao2025-08-29  32

    动态代理,

             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{ @Override public 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(){ @Override public 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(); } }

    转载请注明原文地址: https://ju.6miu.com/read-1302103.html
    最新回复(0)