java动态代理

java有两种动态代理,JDK动态代理和CGLib动态代理,二者的区别如下
* 代理范围:JDK代理只能代理实现了接口的类,CGLib可以代理没有实现接口的类(spring AOP 中如果类实现了接口,默认使用JDK代理)
* 实现原理:CGLib使用底层的字节码技术,为被代理类生成子类,在子类中使用方法拦截技术拦截父类方法的调用,因为是继承,所以被代理类和方法最好不要声明为final(注意:CGlib代理依赖CGLib.jar和asm.jar)
*性能:CGGlib创建的代理对象要比JDK的性能高很多,但是创建时所花费的时间却比JDK动态代理要多,CGLib适合单例等生命周期比较长的对象。

例子

接口和被代理类

public interface subjectInterface {
    public void doTask();
}

public class Subject implements subjectInterface {
    @Override
    public void doTask() {
        // TODO Auto-generated method stub
        System.out.println("执行任务");
    }
}

JDK代理

import java.lang.reflect.*;

public class JDKDynamicProxy implements InvocationHandler {
    private Object target;// 被代理对象

    // 返回代理对象
    public Object bindTarget(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        Object result = null;

        result = method.invoke(target, args);// 实现代理

        return result;
    }

}

CGLib 代理

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 CGlibProxy implements MethodInterceptor {

    private Object target;

    // 创建代理对象
    public Object bindTarger(Object target) {
        this.target = target;// 设置被代理对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());// 设置要创建的子类的父类
        enhancer.setCallback(this);// 回调方法
        return enhancer.create();// 通过字节码技术动态创建子类
    }

    @Override
    // 拦截父类方法的调用,可在这里织入横切逻辑
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        // TODO Auto-generated method stub
        Object result = proxy.invokeSuper(obj, args);// 调用父类方法
        return result;
    }

}

测试

public class ProxyTest {
    public static void main(String[] args) {
        Subject subject = new Subject();
        JDKDynamicProxy proxy = new JDKDynamicProxy();
        subjectInterface s1 = (subjectInterface) proxy.bindTarget(subject);
        System.out.println("使用JDK动态代理");
        s1.doTask();

        CGlibProxy cglibproxy = new CGlibProxy();
        Subject s2 = (Subject) cglibproxy.bindTarger(subject);
        System.out.println("使用CGLib代理");
        s2.doTask();

    }

}

结果

使用JDK动态代理
执行任务
使用CGLib代理
执行任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值