public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
1.创建这个接口的实现类,对将要增强的方法进行重写:
public class UserDaoImp 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;
}
2.使用proxy创建接口代理对象
1.ClassLoader loader:用哪个类加载器去加载代理对象;
2.Class[] interfaces:这是一个Class型的数组:数组内容是需要代理类需要实现的接口
3.InvocationHandler:定义一个方法,内容是被增强后的方法
newProxy调用时也可以这样写更清楚:
//声明一个Class[]数组将需要实现的接口放到这个数组里边
Class[] interfaces={UserDao.class};
//创建一个接口的实现类
UserDaoImp userDaoImp=new UserDaoImp();
//使用newProxyInstance()
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImp));
//可以新创建一个类,让这个类实现InvocationHandler接口,
//得到这个类创建的对象之后,传入到newProxyInstance()中
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;
}
}
这样基本就是实现了JDK的动态代理。