java中的两种动态代理实现

基于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();

    }

执行结果
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值