基于jdk的动态代理
通过动态代理在运行期动态创建某个interface的实例
public interface Person {
public void show();
}
public class PersonHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("there is PersonHandler");
System.out.println(method.getName());
return null;
}
}
// 在运行期动态创建某个接口的实例
@Test
void JdkAchieve_interface(){
Person person= (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class[]{Person.class},
new PersonHandler());
person.show();
}
执行结果如下
通过动态代理实现对实例方法的增强
主要有三种:
- 目标方法执行前 预处理
- 选择性是否执行 目标方法(可以执行也可以不执行)
- 目标方法执行后 收尾处理
public class PersonImpl implements Person{
@Override
public void show() {
System.out.println("这里是PersonImpl");
}
}
public class PersonHandler implements InvocationHandler {
private Person person; //代理对象,这里我特指为Person,可以通过Object进行泛指
// 构造方法中需要传入对象。
public PersonHandler(Person person){
this.person=person;
}
public PersonHandler(){}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("there is PersonHandler");
method.invoke(person,args); // 这里就是调用目标方法,不写的话就是没调用。
System.out.println("方法执行完毕,准备退出");
return null;
}
}
// 增强方法
@Test
void JdkAchieve_case(){
Person person= (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class[]{Person.class},
new PersonHandler(new PersonImpl()));
person.show();
}
执行结果
基于cglib的动态代理
内部设定
public class CglibProxy implements MethodInterceptor {
private Object target;//代理的目标对象
public CglibProxy(){}
public Object getCglibProxy(Object target){
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);//设置回调
Object result=enhancer.create();
return result;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法开始之前");
Object res=method.invoke(target,objects);
System.out.println("方法运行之后");
return res;
}
}
// 测试
@Test
void CglibAchieve(){
CglibProxy proxy=new CglibProxy();
Person person= (Person) proxy.getCglibProxy(new PersonImpl());
person.show();
}
运行结果
外部设定
public class CglibProxy2 implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法开始之前");
Object res=methodProxy.invokeSuper(o,objects);
System.out.println("方法运行之后");
return res;
}
}
// 外部设定参数
@Test
void CglibAchieve_outside(){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(PersonImpl.class);
enhancer.setCallback(new CglibProxy2());
Person person= (Person) enhancer.create();
person.show();
}
执行结果