主要利用的两个类是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 {
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};
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