文章字数:340,阅读全文大约需要1分钟
JDK动态代理
- 只能代理接口
- 思路是新建一个接口的实现类,并持有需要被代理的实现类。将被代理的对象方法进行增强。
定义一个接口
1
2
3
4public interface Animal {
String run();
String jump();
}需要代理的类
1 | public class Dog implements Animal { |
- 代理类,需要以
Proxy
结尾1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class DogProxy implements InvocationHandler {
// 目标类,也就是被代理对象
private Object target;
public void setTarget(Object target)
{
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置动作");
Object result = method.invoke(target, args);
System.out.println("后置动作");
}
// 生成代理类
public Object CreatProxyedObj()
{
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
CGLIB
- 可以代理普通类
- 思路是新建一个子类继承需要被代理的目标类,通过继承的方式持有原来的方法
- 通过字节码操作形成新的类,会占用方法区(元空间)的空间,过于频繁的操作肯能会导致内存溢出
1 | public class CglibProxy implements MethodInterceptor |