主要利用的两个类是java.lang.reflect包下的Proxy类和InvocationHandler类
实现步骤
- 1、创建接口,定义方法
public interface UserDao {
int add(int a, int b);
}
- 2、创建接口实现类,实现接口方法(该实现类即为被代理对象)
public class UserDaoImpl implements UserDao {
public int add(int a, int b) {
return a+b;
}
}
- 3、创建InvocationHandler的实现类,将被代理对象传入,并重写invoke方法(在该方法中添加增强逻辑)
class UserDaoProxy2 implements InvocationHandler {
//1、传入被代理对象,用两种方式:1:有参构造器;2、set方法
private Object obj;
public UserDaoProxy2(Object obj){
this.obj = obj;
}
public UserDaoProxy2() {
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("前...方法名:" + method.getName() + " 参数:" + Arrays.asList(args));
//方法执行,执行被代理对象的对应的方法
System.out.println("方法开始执行");
Object result = method.invoke(obj, args);
//方法之后
System.out.println("后...result=" + result + " obj=" + obj);
return result;
}
}
- 4、编写测试类测试,使用Proxy的newProxyInstance方法获取代理类对象,注意传入的三个参数。
1、类加载器;
2、实现的接口的运行时类;
3、InvocationHandler的实现类(一般是在该类中写方法获取代理实例)
public class JDKProxy2 {
public static void main(String[] args) {
//第一个参数:类加载器
//第二个参数:需实现的接口的运行时类数组
Class[] interfaces = {UserDao.class};
//第三个参数:InvocationHandler的实现类对象
UserDao userDao = new UserDaoImpl();
//获取代理类实例
UserDao o = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy2(userDao));
int add = o.add(2, 4);
System.out.println("输出:" + add);
}
}
输出结果:
前...方法名:add 参数:[2, 4]
方法开始执行
后...result=6 obj=com.kuang.demo2_dynamic.UserDaoImpl@66d3c617
输出:6