newProxyInstance(ClassLoader loader, 类>[] interfaces, InvocationHandler h) //返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
JDK动态代理(有接口情况)ClassLoader 类加载器 interfaces 增强方法所在类 类所实现的接口-------Class[] interfaces = {UserDao.class}; InvocationHandler 实现InvocationHandler 创建代理对象 写增强方法 是一个接口
创建接口,定义方法
public interface UserDao { public int add(int a,int b); public String update(String id); }
创建接口实现类,实现方法
public class UserDaoImpl implements UserDao{ @Override public int add(int a, int b) { return a + b; } @Override public String update(String id) { return id; } }
使用Proxy类创建代理对象
public class JDKProxy { public static void main(String[] args) { //创建接口实现类的代理对象 Class[] interfaces = {UserDao.class}; UserDaoImpl userDao = new UserDaoImpl(); UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao)); int add = dao.add(4, 8); System.out.println(add); }
//创建代理对象的代码 class UserDaoProxy implements InvocationHandler { //1 我们创建的是UserDao的代理对象要把它传过来,也就是增强前的逻辑 //通过有参构造进行传递 private Object object; public UserDaoProxy(Object object) { this.object = object; } //是我们增强的逻辑 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前 System.out.println("方法之前执行"+method.getName() + Arrays.toString(args)); //增强方法 Object rst = method.invoke(object, args); if (method.getName().equals("add")){ System.out.println("hhhh"); } //方法之后 System.out.println("方法之后执行"+object); return rst; } }
(1)连接点:类里面可以被增强的方法。
(2)切入点:实际被增强的方法。
(3)通知(增强):实际增加的逻辑部分。( 通知有多种类型)
前置通知
后置通知
环绕通知
异常通知
最终通知(finally)
(4)切面:把通知应用到切入点的过程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)