- 浏览: 140596 次
- 性别:
- 来自: 北京
-
文章分类
转自http://javatar.iteye.com/blog/814426
注意:但写new ArrayList时无法识别,必须全写为字符串形式,即new ArrayList.class.getName(),return (("+ifaces.getName()+")t)为同理
//用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)为同理
发表评论
-
storm 安装
2013-09-02 16:32 3073------------------------------- ... -
java 类加载器学习
2012-12-14 10:47 1039引用1.自定义类加载器 public interface ... -
jackson 学习
2012-11-13 15:42 10121.json 转为object对象 public clas ... -
java 线程池 异常 处理 机制 分析
2012-10-31 19:34 2139public class ThreadTest { ... -
ThreadPoolExecutor 原理-- java 线程池
2012-08-08 19:14 1149整个ThreadPoolExecutor的任务处理有4 ... -
java 缓冲
2012-08-08 19:12 1080import org.apache.log4j.Logge ... -
java 程序消耗 cpu 100% 查找方法
2012-05-16 14:38 17222问题原因:由于HashMap是非线程安全的,在多线程访问时,造 ... -
java io
2012-04-24 11:06 9251、按字节读取文件内容 2、按字符读取文件内容 3、按行读取 ... -
java 内省
2011-11-20 22:58 866java内省 -
系统常用工具类
2011-04-20 17:46 10581.ArithUtil.java ... -
spring 面向切面编程
2010-12-27 17:03 1099@Aspect public class AspectCoup ... -
jxl 写入excel
2010-11-10 13:52 10201.程序调用 ReportInterface report ... -
java 读取excel
2010-11-10 09:04 962package com.longtuo.client.act ... -
java 生成略缩图
2010-10-20 17:21 1210import java.awt.Graphics2D; imp ... -
XStream简单介绍
2010-09-10 15:44 1694创建能够序列化的类 这是一组简单的类。XStream能把这 ... -
java中对集合类的排序
2010-05-04 13:47 9081.第一种 public class User impleme ... -
Java 获取操作系统信息与Desktop类
2009-11-17 16:24 1373import java.util.Properties; ... -
java 事物处理
2009-10-15 10:52 1440public boolean deleteSchedule ...
相关推荐
在性能方面,JDK动态代理由于不涉及字节码生成,所以在运行时的性能通常优于CGLIB。然而,如果目标类的方法很多,CGLIB可能会更高效,因为它只需创建一次子类,而JDK动态代理每次调用都需要通过InvocationHandler。...
在Java编程中,动态代理是一种强大的工具,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。Spring框架提供了一种便捷的方式来实现动态代理,这使得我们可以在不修改原有代码的情况...
CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,主要用于Java字节码操作和动态代理。与JDK动态代理不同,CGLIB不依赖于接口,而是通过继承目标类来创建代理对象。 1. **CGLIB核心组件**:主要...
Java中的代理模式是一种设计模式,它允许我们创建一个代理类,该类代表并增强另...在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要频繁添加或修改代理行为的场景,动态代理通常是更好的选择。
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
动态代理在Java编程中是一种非常重要的技术,它允许我们在运行时创建代理类,这些代理类可以作为原有类的“中间人”,在调用原始方法之前或之后执行额外的操作。这通常用于实现AOP(面向切面编程)的概念,如日志、...
- CGLIB是一个高性能、代码生成库,它可以实现在运行时创建目标类的子类,从而实现动态代理。 - 适用于那些无法使用JDK动态代理的情况,比如目标类没有实现接口。 - 使用步骤: 1. 创建Enhancer对象并设置被代理...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...
在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不...在实际开发中,根据业务需求和性能考虑,选择合适的动态代理方式,可以有效地提高代码的可维护性和扩展性。
Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控等领域。...
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解Java动态代理的概念,并通过一个简单易懂的demo来演示其用法。 1. **Java动态代理概念** Java动态代理基于Java反射...
Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。...JDK动态代理适用于接口丰富的场景,而Cglib更适合对性能有较高要求或者目标对象无法实现接口的情况。
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...
动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。首先,...
动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而实现对原对象的一些额外操作或扩展功能。JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态...
在Spring Boot应用中,动态代理是一种非常重要的技术,主要用于实现AOP(面向切面编程)。在本场景下,"springboot中的 动态代理的选择测试代码"涉及到的是如何在Spring Boot环境中利用Java或CGLIB动态代理来实现...