`

动态代理性能比较

 
阅读更多
转自http://javatar.iteye.com/blog/814426
//用javassit得到动态代理
    public T createJavassistBytecodeDynamicProxy(LoadBalance loadBalance,ConcurrentMap<String, T> map,Class ifaces){
        try{
            ClassPool mPool = new ClassPool(true);
            CtClass mCtc = mPool.makeClass(ifaces.getName() + "JavaassistProxy");
            mCtc.addInterface(mPool.get(ifaces.getName()));
            mCtc.addConstructor(CtNewConstructor.defaultConstructor(mCtc));

            mCtc.addField(CtField.make("public " + loadBalance.getClass().getName() + " sub;", mCtc));
            mCtc.addField(CtField.make("public " + map.getClass().getName() + " map;", mCtc));
//            mCtc.addField(CtField.make("public " + ArrayList.class.getName() + " list;", mCtc));

            mCtc.addMethod(CtNewMethod.make("public Object getRealClient() { return (Object)sub.select(new "+ArrayList.class.getName()+"(map.values())); }",mCtc));

            //获取接口的方法
            for(Method method: ifaces.getMethods()){
                Class returnType = method.getReturnType();
                String modifiers =  "public";
                if(Modifier.PUBLIC==method.getModifiers()){
                    modifiers="public";
                }else if(Modifier.PROTECTED==method.getModifiers()){
                    modifiers="protected";
                }else if(Modifier.PRIVATE==method.getModifiers()){
                    modifiers="private";
                }
                Class<?>[] parameter = method.getParameterTypes();

                String params = "";
                String ps = "";
                for(Class param:parameter){
                   params += param.getName()+" "+param.getName()+",";
                   ps+=param.getName()+",";
                }
                if(params.equals("")){
                    params = "";
                    ps="";
                }else{
                    params=params.substring(0,params.length());
                    ps=ps.substring(0,ps.length());
                }
                
                mCtc.addMethod(CtNewMethod.make(modifiers +" void "+method.getName()+"(String a,String b){ Object t=this.getRealClient(); return (("+ifaces.getName()+")t)."+method.getName()+"(a,b) ;}", mCtc));
//                mCtc.addMethod(CtNewMethod.make("public int count() { return delegate.count(); }", mCtc));
            }


            Class<?> pc = mCtc.toClass();

            mCtc.debugWriteFile("/home/liguojun");
            mCtc.writeFile("/home/liguojun");

            T bytecodeProxy = (T) pc.newInstance();
            Field filed = bytecodeProxy.getClass().getField("sub");
            filed.set(bytecodeProxy, loadBalance);

            Field filed1 = bytecodeProxy.getClass().getField("map");
            filed1.set(bytecodeProxy, map);

            return bytecodeProxy;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;

    }


注意:但写new ArrayList时无法识别,必须全写为字符串形式,即new ArrayList.class.getName(),return (("+ifaces.getName()+")t)为同理
分享到:
评论

相关推荐

    浅谈JDK动态代理与CGLIB代理去区别

    在性能方面,JDK动态代理由于不涉及字节码生成,所以在运行时的性能通常优于CGLIB。然而,如果目标类的方法很多,CGLIB可能会更高效,因为它只需创建一次子类,而JDK动态代理每次调用都需要通过InvocationHandler。...

    spring+动态代理

    在Java编程中,动态代理是一种强大的工具,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。Spring框架提供了一种便捷的方式来实现动态代理,这使得我们可以在不修改原有代码的情况...

    Jdk动态代理和cglib动态代理原理

    CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,主要用于Java字节码操作和动态代理。与JDK动态代理不同,CGLIB不依赖于接口,而是通过继承目标类来创建代理对象。 1. **CGLIB核心组件**:主要...

    Java静态代理和动态代理

    Java中的代理模式是一种设计模式,它允许我们创建一个代理类,该类代表并增强另...在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要频繁添加或修改代理行为的场景,动态代理通常是更好的选择。

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    动态代理例子

    动态代理在Java编程中是一种非常重要的技术,它允许我们在运行时创建代理类,这些代理类可以作为原有类的“中间人”,在调用原始方法之前或之后执行额外的操作。这通常用于实现AOP(面向切面编程)的概念,如日志、...

    一篇讲动态代理的好文 <动态代理的前世今生>

    - CGLIB是一个高性能、代码生成库,它可以实现在运行时创建目标类的子类,从而实现动态代理。 - 适用于那些无法使用JDK动态代理的情况,比如目标类没有实现接口。 - 使用步骤: 1. 创建Enhancer对象并设置被代理...

    静态代理和动态代理Demo

    静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...

    关于jdk动态代理的源码剖析

    ### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...

    AOP之JDK动态代理和CGLib动态代理

    在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不...在实际开发中,根据业务需求和性能考虑,选择合适的动态代理方式,可以有效地提高代码的可维护性和扩展性。

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控等领域。...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    java动态代理demo

    动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解Java动态代理的概念,并通过一个简单易懂的demo来演示其用法。 1. **Java动态代理概念** Java动态代理基于Java反射...

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。...JDK动态代理适用于接口丰富的场景,而Cglib更适合对性能有较高要求或者目标对象无法实现接口的情况。

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

    动态代理实现AOP机制

    动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。首先,...

    使用cglib演示动态代理时用到的jar包 aop 动态代理

    动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...

    JDK动态代理和CGLIB代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而实现对原对象的一些额外操作或扩展功能。JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态...

    springboot中的 动态代理的选择测试代码

    在Spring Boot应用中,动态代理是一种非常重要的技术,主要用于实现AOP(面向切面编程)。在本场景下,"springboot中的 动态代理的选择测试代码"涉及到的是如何在Spring Boot环境中利用Java或CGLIB动态代理来实现...

Global site tag (gtag.js) - Google Analytics