动态代理(转)
package cn.itcast.b_dynamic; // 接口 public interface IUserDao { void save(); }
package cn.itcast.b_dynamic; /** * 目标对象 * @author Jie.Yuan * */ public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----已经保存数据!!!------"); } }
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){ 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; } }); } }
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(); // class $Proxy0 内存中动态生成的代理对象 System.out.println(proxy.getClass()); // 执行方法 【代理对象】 proxy.save(); } }