spring-210727-02—AOP-JDK动态代理实现
如何使用动态代理
使用JDK动态代理,
使用Proxy类里面的方法newProxyInstance创建代理对象。
java.lang.reflect.Proxy
newProxyInstance的三个参数:
第一个:类加载器
第二个:增强方法所在的类,这个类实现的接口,支持多个接口
第三个:实现接口InvocationHander,创建代理对象,写增强的方法
演示
UserDao.java
package com.bgy.spring.dao;
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
UserDaoImpl.java
package com.bgy.spring.dao;
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
System.out.println("add方法执行了..........");
return a+b;
}
@Override
public String update(String id) {
System.out.println("update方法执行了..........");
return id;
}
}
JDKProxy.java
package com.bgy.spring.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
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 result = dao.add(1, 1);
System.out.println(result);
}
}
class UserDaoProxy implements InvocationHandler{
private Object obj;
public UserDaoProxy(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前执行--->"+method.getName()+":传递的参数是--->"+ Arrays.toString(args));
Object res = method.invoke(obj,args);
System.out.println("方法之后执行--->"+obj);
return res;
}
}