1. 使用JDK动态代理,
调用如下方法
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
方法有三个参数loader
- 定义代理类的类加载器interfaces
- 代理类要实现的接口列表h
- 指派方法调用的调用处理程序
2、编写代码
1、创建一个接口
package com.daijunyi.dao;
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
2、创建一个接口实现类
package com.daijunyi.dao;
public class UserDaoImp implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id;
}
}
3、写代理
package com.daijunyi.test;
import com.daijunyi.dao.UserDao;
import com.daijunyi.dao.UserDaoImp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};
UserDaoImp userDaoImp = new UserDaoImp();
UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoImp);
UserDao userDao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, userDaoProxy);
userDao.add(1,2);
userDao.update("11");
}
}
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()+":传递参数:"+args.toString());
//原来方法执行
System.out.println("原来方法执行:"+method.getName()+":传递参数:"+args.toString());
Object invoke = method.invoke(this.obj, args);
//方法之后
System.out.println("方法之后执行:"+method.getName()+":传递参数:"+args.toString());
return invoke;
}
}