java 动态代理

转载另外一个博主,博主代码没有格式化,所以重新贴一下。

 

public class JDKProxyFactory<T> implements InvocationHandler {

    /**
     * 要代理的真实对象
     */
    private T target;

    /**
     * 构造方法
     * @param target
     */
    public JDKProxyFactory(T target) {
        this.target = target;
    }

    /**
     * 获取代理对象
     * @return
     */
    public T getProxy(){
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /*方法增强*/
        System.out.println("大家好!!");

        Object result = method.invoke(target, args);

        /*方法增强*/
        System.out.println("再见!!!");
        return result;
    }
}
public class CgLibProxyFactory<T> implements MethodInterceptor {

    /**
     * 获取代理对象
     * @param clazz 需要被代理的目标对象
     * @return 代理对象
     */
    public T getProxyByCgLib(Class<T> clazz){
        /*创建增强器*/
        Enhancer enhancer = new Enhancer();

        /*设置需要增强的类的类对象*/
        enhancer.setSuperclass(clazz);
        /*设置回调函数*/
        enhancer.setCallback(this);

        /*获取增强之后的代理对象*/
        return (T)enhancer.create();
    }

    /**
     * 代理对象的回调
     * @param o 代理对象,也就是"目标对象" 的子类
     * @param method 目标对象  的 方法
     * @param objects 参数
     * @param methodProxy 代理对象的方法
     * @return 返回结果 返回给调用者
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib ==> 大家好");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("cglib ==> 再见");
        return result;
    }
}
@Test
    public void testCgLibProxy(){
        /*创建实例*/
        PersonalImpl personal = new PersonalImpl();

        /*获取代理类*/
        CgLibProxyFactory<PersonalImpl> factory = new CgLibProxyFactory<PersonalImpl>();

        PersonalImpl proxy = factory.getProxyByCgLib((Class<PersonalImpl>) personal.getClass());

        generatorClass(proxy);

        proxy.introduction();

    }


    @Test
    public void testProxy(){
        /*创建实例*/
        Personal personal = new PersonalImpl();
        /*创建代理对象*/
        JDKProxyFactory<Personal> factory = new JDKProxyFactory<Personal>(personal);

        Personal proxy = factory.getProxy();

        generatorClass(proxy);

        proxy.introduction();
    }

 

转载于:https://my.oschina.net/u/2699666/blog/2208983

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值