【java】三种代理方式实现

静态代理

为代理对象编写一个代理类,然后运行方法前使用代理类执行

动态代理

通过jdk反射生成代理类,动态在内存中构建代理对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class InvocationHandlerlmpl implements InvocationHandler {
// 这其实业务实现类对象,用来调用具体的业务方法
private Object target;
// 通过构造函数传入目标对象
public InvocationHandlerlmpl(Object target) {this.target = target}
//动态代理实际运行的代理方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用开始处理");
//下面 invoke0方法是以反射的方式来创建对象,第一个参数是要创建的对象,第二个是构成方法的参数,由第二个参数来决定创建对象使用哪个构造方法
Object result = method.invoke(target, args);
System.out.println("调用结束处理");
return result;
}
}

CGLIB动态代理

利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
反射完成代理,可以直接代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//代理主要类
public class CglibProxy implements Methodlnterceptor {
private Object targetObject;
// 这里的目标类型为 Object,则可以接受任意一种参数作为被代理类,实现了动态代理
public Object getlnstance(Object target) {
// 设置需要创建子类的类
this.targetObject = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
//代理实际方法
public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
System.out.println("开启事务");
Object result = proxy.invoke(targetObject, args);
System.out.println("关闭事务");
//返回代理对象
return result;
}
}