`

动态代理性能比较

 
阅读更多
转自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)为同理
分享到:
评论

相关推荐

    # 动态代理的应用场.md

    动态代理是一种常见的设计模式,它在Java开发中广泛应用。通过动态代理,我们可以在运行时生成代理类,用于代理真实对象的方法调用。这种代理机制允许我们在不修改原始代码的情况下,对原始对象的行为进行扩展、增强...

    cglib aop spring 动态代理

    jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...

    # 动态代理设计模式.md

    动态代理是一种设计模式,它允许在运行时为对象创建代理,并在代理对象上执行方法调用。代理对象可以拦截对真实对象的访问,并允许在调用前后插入附加逻辑。这种设计模式可以用于横切关注点的集中处理,如日志记录、...

    Java理论与实践:用动态代理进行修饰

    本文介绍了动态代理为实现许多常见设计模式提供了替代的动态机制。虽然这些模式不使用动态代理,只用普通的类就能够实现,但是在...除了最关注性能的应用程序之外,动态代理方式可能比手写或机器生成stub的方式更可取。

    基于java的企业级应用开发:JDK动态代理.ppt

    * * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...

    Adroid动态加载Apk-插件化技术框架(动态代理方案)源码

    Android动态加载Apk-插件化技术(动态代理方案) 一. 什么是插件化 1. 主App(宿主App)加载插件apk的实现 2. 每个业务组件模块形成一个独立的Apk, 然后通过主App动态加载部署业务组件模块Apk的一种方案 二.插件化的...

    Java动态代理CGlib Jar包

    CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和dynaop)提供方法拦截。Hibernate作为最流行的ORM工具也同样使用CGLIB库来代理单端关联(集合懒加载除外,它使用另外一...

    live555流媒体 动态端口 转发代理

    在别人编译的 live.2013.11.15_VS2012 代码基础上修改代理服务那模块,将代理端口参数化,实现 流媒体代理固定端口为 554或8554的限制。

    【重要VIP级别】Java动态代理文档解释+案例代码实现

    Java动态代理文档解释+案例代码实现。充分的体现了企业化思想。此案例使用动态代理实现了某个业务对象的性能分析。可商用!设置100积分谢谢。整理不易

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    简介: 本资源将深入探讨Spring框架中使用的两种关键...JDK动态代理与CGLib的比较: 我们将比较这两种动态代理方式的优劣势,以帮助您选择适合您项目需求的代理方式。您将了解它们在性能、可用性和适用场景方面的差异。

    论文研究-基于Kriging代理模型的动态云任务调度方法.pdf

    提出一种基于Kriging代理模型的动态云任务调度方法。通过对云任务在不同资源组合下的性能表现进行Kriging代理模型建模并优化,从而得到对应于该云任务的最优资源分配方案;利用云平台的API,可动态对该云任务实施...

    构建高性能Web站点(PDF)

    1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.1 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.13 优化数据库 1.14 考虑可扩展性 1.15 减少视觉等待 第...

    构建高性能Web站点_PDF_45.5M

    1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.10 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.13 优化数据库 1.14 考虑可扩展性 1.15 减少视觉等待 ...

    构建高性能web站点 高清完整版

    从多个方面、多个角度进行了全面的阐述,涵盖了Web站点性能优化的几乎所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存...

    构建高性能Web站点(PDF)-第2部分

    1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.1 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.13 优化数据库 1.14 考虑可扩展性 1.15 减少视觉等待 第...

    Nginx正向代理 反向代理机制

    Nginx在做反向代理时,能够提供性能稳定并且灵活配置的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器。Nginx还对可以对返回结果进行异常判断,...

    基于AGENT的动态路由的研究

    在介绍了移动代理后,主要讨论了将移动代理用在这种新技术运用到路由算法中去,并提出了一种全新的基于移动代理的动态路由算法。分析了当今几种路由算法的不足和研究了移动代理优越性的基础上,提出了一种基于移动...

    构建高性能Web站点(修订版).pdf

    从多个方面、多个角度进行了全面的阐述,几乎涵盖了Web站点性能优化的所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存...

    构建高性能Web站点

    从多个方面、多个角度进行了全面的阐述,几乎涵盖了Web站点性能优化的所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存...

Global site tag (gtag.js) - Google Analytics