动态代理 的四个步骤:
-
-
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
-
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
-
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
1 package com.yztc.aop; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 public class AccountProxy implements InvocationHandler { 8 //代理目标对象 9 private Object target; 10 public Object newProxyInstance(Object object){ 11 this.target= object; 12 return 13 Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this); 14 15 } 16 17 18 @Override 19 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 20 System.out.println("start---->代理类开始工作!!"); 21 for (int i = 0; i < args.length; i++) { 22 System.out.println(args[i]); 23 24 } 25 //在执行核心方法之前使用能够调用公共的操作 26 System.out.println("调用核心方法之前"); 27 //要执行的核心方法 28 Object invoke = method.invoke(target, args); 29 System.out.println("调用核心方法之后"); 30 return invoke; 31 } 32 33 }
1 package com.yztc.aop; 2 3 public interface IAccountDao { 4 void add(String name); 5 void delete(String uid); 6 }
1 package com.yztc.aop; 2 3 public class AccountDaoImpl implements IAccountDao { 4 5 @Override 6 public void add(String name) { 7 System.out.println("add:==="+name); 8 } 9 10 @Override 11 public void delete(String uid) { 12 System.out.println("delete"+uid); 13 } 14 15 }
1 package com.yztc.aop; 2 3 import com.yztc.aop.bean.AccountDaoImpl2; 4 import com.yztc.aop.bean.CglibProxy; 5 6 public class TestMain { 7 public static void main(String[] args) { 8 IAccountDao accountDao = (IAccountDao) new AccountProxy().newProxyInstance(new AccountDaoImpl()); 9 accountDao.add("xiaoming"); 10 accountDao.delete("1"); 11 }