java jdk动态代理 cglib动态代理demo

最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo

jdk动态代理实现:

View Code
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {
    private Target target;

    public DynamicProxy(Target target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before the work");
        method.invoke(target, args);
        System.out.println("after the work");
        return null;
    }

    public Target getProxy() {
        Class<?>[] interfaces = this.target.getClass().getInterfaces();
        if (interfaces == null || interfaces.length == 0) {
            interfaces = new Class<?>[] { Target.class };
        }

        Target proxy = (Target) Proxy.newProxyInstance(this.target.getClass()
                .getClassLoader(), interfaces, this);
        return proxy;
    }

    public static void main(String[] args) {
        Target target = new TargetImpl();
        new DynamicProxy(target).getProxy().sayHello();
    }

}

interface Target {
    public void sayHello();
}

class TargetImpl implements Target {
    public void sayHello() {
        System.out.println("hello world");
    }
}

cglib动态代理demo:

View Code
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestCglibProxy {
    public static void main(String[] args) {
        Target target = new Target();
        TestCglibProxy testCglibProxy = new TestCglibProxy();
        Target targetProxy = (Target) testCglibProxy.createProxy(target
                .getClass());
        targetProxy.sayHello();
    }

    public Object createProxy(Class targetClass) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(new MethodInteceptor());
        return enhancer.create();
    }
}

class MethodInteceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object object, Method method, Object[] arg2,
            MethodProxy methodProxy) throws Throwable {
        System.out.println("start to do the work");
        Object result = methodProxy.invokeSuper(object, arg2);
        System.out.println("end:do the work");
        return "haha";
    }
}

class Target {
    public void sayHello() {
        System.out.println("hello world");
    }
}

jdk实现版本只支持接口的动态代理,如果某个类没有实现接口,他就无法为他进行动态代理,在生成代理对象的时候需要传入的参数就包括“接口”

cglib实现方式不利用接口,而是为现有的类,生成一个子类,然后进行调用.cglib底层实现用asm方式

对于这两种方式的底层具体实现还需要再研究

 

转载于:https://www.cnblogs.com/striveforver/archive/2012/09/29/2708080.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值