- 浏览: 1011690 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
http://labs.jboss.com/javassist/
这个Jboss 的项目可以动态的构造 Java 类, 其功能算是比较强大的了. 但是任何强大的东东都是双刃剑, 那就如果很好的运用, 可以大大的提升系统的灵活性, 可扩展性和性能; 如果使用不当,对系统的冲击也是很大的.
这里我不介绍具体的开发方法(可以到上面的网址去获取开发文档), 我会从其使用的场景, 系统层次等方面介绍怎样才算是很好的使用这个技术. 首先我介绍一些使用原则:
1. 动态构建 Java 类, 跟反射机制一样, 其强大, 但是不能滥用. (我先前写一了篇文章介绍反射的一个使用原则.) 动态构建 Java 类也最好跟反射机制一样只使用在模块内部, 不要跨模块调用. 比如, 模块A需要使用模块B 的一个类, 那么就将这个类在 模块 B 中生成好, 传递给模块A; 不要通过模块A 去生成 这个类.
2. 使用 动态类生成技术, 最好只针对一些简单的 java 对象, 比如 Java Bean. 最好不要通过这种技术去生成逻辑处理类.
3. 基于第二点, 其生成类所依赖的其他类最好是 JDK 自带的. 如果依赖应用本身的其他类, 最好也是简单的java对象.
4. 注意资源的释放. 我们可能会不断的生成类, 那么就需要注意, 是否需要释放这些类. 比如某个类应该是动态变化的, 在新的类生成后, 就应该将以前的那个释放掉. 确保没有内存泄露等问题.
动态构造 Java 类的一种方法: javassist (2) 收藏
http://blog.csdn.net/loveyly/archive/2007/09/21/1794927.aspx 第一部分
接下来,我来举一个例子. 我们经常使用 Java Bean 来装载业务对象数据, 但是这里有一个需求就是, 对于不同的应用场景, 可能某个业务对象所包含的属性不一样, 也就是 Java Bean 中的 Property 可能不确定, 可能增加, 也可能删除一个或者多个属性. 如果开发人员自己开发这个 Java Bean 可能是无法满足这个需求了. 这里通过javassist 来动态生成 Java Bean 对象, 就是一个比较好的方法.
这里需要强调几点: 1. 我们需要确保 ClassLoader 装载所有的动态生成类时, 也可以访问普通的途径的 Java 类; 2. 因为涉及到新的Class取代旧的Claas, 需要及时通过释放 CtClass 来确保不因为其缓存导致内存不段被无限制的使用; 3. 这里动态生成 Java Bean 主要是针对动态属性的支持, 那么这就需要应用是在这样的场景下使用此特性的: 对象属性更新不是很频繁(一般也不会). 不然就会有性能问题.
这里一般会有一个业务对象模块, 对象的生成都是在该模块内部进行的, 所有使用该模块获取的对象, 都已经是一个普通的 Java Bean 对象了.
通过这个方法, 可以让业务开发人员只关心业务对象定义, 具体的 Java 类就有系统自动生成, 既灵活又方便.
动态构造 Java 类的一种方法: javassist (3) 收藏
http://blog.csdn.net/loveyly/archive/2007/09/21/1794927.aspx
第一部分
http://blog.csdn.net/loveyly/archive/2007/09/21/1794971.aspx
第二部分
动
态构造 Java 类, 还有个作用就是性能的提升. 巧用这个方法, 会大大的提升系统的性能. 我举个例子, OGNL2.7 版本中就是用
javassist 构造对象的访问代码, 将以前涉及到大量同步操作的代码全部去掉了. 这样一来, 访问对象就是直接调用一个类的方法,
没有任何反射在里面, 性能非常好.
对于性能提升, 这里主要运用到的是将很多通过反射或者 Java Bean Property 的操作封装成一个可以直接调用的 Java 代码. 一般来说, 这个封装类会实现一个接口, 然后调用者直接调用这个接口的某个方法去访问数据对象的某个成员变量.
也就是将一个本来不知道类型的对象实例, 封装成了一个统一的访问接口实现. 这也是用好动态 Java 生成技术的一个思路. 不过一定要注意, 这个接口定义一定是某个模块内部的. 比如 OGNL , 这个接口就只会在模块内部使用.
这个思路可以运用到其他很多地方. 希望大家能多多提供应用实践. 呵呵
动态构造 Java 类的一种方法: ClassLoader 的设计 (4) 收藏
http://blog.csdn.net/loveyly/archive/2007/09/21/1794927.aspx
第一部分
http://blog.csdn.net/loveyly/archive/2007/09/21/1794971.aspx
第二部分
http://blog.csdn.net/loveyly/archive/2007/09/25/1799733.aspx
第三部分
对于ClassLoader 的设计, 可以按照如下的思路进行:
1. 首先检测缓存中是否存在该className的key(注意是存在key, 可以参考我以前的一片文章http://blog.csdn.net/loveyly/archive/2007/09/19/1791577.aspx
), 如果存在, 则直接返回;
2. 否则使用 parent ClassLoader (一般是当前线程的上下文ClassLoader)查找该类, 如果找到, 放入缓存, 返回;
3. 如果没有, 使用获取对象描述, 使用javassist动态构造类, 并使用本ClassLoader 实例装载该类, 然后返回;
4. 实现一个destroy 方法, 负责清空缓存并调用 Introspector.flushCaches() (负责清空bean的一些缓存).
当更新一个对象描述时, 需要重新使用一个 ClassLoader 实例, 并调用先前的ClassLoader的destroy方法, 让其被垃圾回收.
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1049调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1070Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18111、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 932“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9181、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 991概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 884下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 914<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1647安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1153Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1019///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1056J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1259六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1574HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2115最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 967Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 965在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1045maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 130924小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 106913.9. 使用Spring的 ...
相关推荐
Java字节码工程工具包,通常被称为Javassist,是一个开源项目,专为Java开发者提供了一种方便的方式来处理和操作字节码。Javassist在Java应用开发中扮演着重要的角色,尤其是在动态代理、AOP(面向切面编程)以及...
1. **字节码操作**:Javaassist提供了一种简单的方法来操作字节码,通过` CtClass `、` CtMethod `和` CtField `等类,可以方便地创建、修改和分析类、方法和字段。例如,你可以使用它来动态添加或修改类的方法,...
在Java中,实例化抽象类的一种常见方式是通过子类继承并实现抽象方法。假设有一个抽象类`AbstractBase`: ```java public abstract class AbstractBase { public AbstractBase() { // 构造方法 } public ...
它提供了一种高级的表示形式,使得开发者可以更容易地理解和操作字节码,而不是直接与复杂的ClassFile结构打交道。 在`javassist`中,主要的概念有以下几个: 1. ** CtClass **:这是`javassist`的核心类,代表一...
它提供了一种在运行时分析、改变和增强类的能力,而无需重新编译。这个版本"javassist-3.15.0-GA"是Javaassist的一个特定发行版,用于支持Java平台的代码操作。 1. **Javaassist基本概念**: - **ClassPool**:...
总结,Javassist提供了一种高级的接口来处理Java字节码,使得开发者能够轻松地进行动态类生成和修改,而无需深入了解字节码底层细节。对于需要实现AOP、代码生成或运行时修改类的场景,Javassist是一个非常实用的...
Java内置的动态代理机制提供了一种创建代理对象的方式,它适用于实现了相同接口的目标对象。通过InvocationHandler接口,开发者可以控制代理对象的方法调用,插入切面逻辑。动态代理虽然简单易用,但局限性较大,...
Javaassist的核心功能在于提供了一种方式来操作字节码(Bytecode),这是Java类文件的基础。通过字节码操作,开发者可以实现诸如AOP(面向切面编程)、动态代理、代码生成等多种高级编程模式。Javaassist 提供了一个...
Java 字节码是Java平台的一种低级表示形式,它是由JVM(Java虚拟机)理解和执行的二进制代码。字节码使得Java程序具有跨平台性,因为不同的操作系统上的JVM可以解析并运行相同的字节码。在Java中,我们可以通过API来...
这种基于Java字节码的软件设计信息提取方法,是软件工程领域中的一种技术,用于从已编译的Java程序中获取设计层面的信息,而无需原始的源代码。这种方法在逆向工程、软件维护、代码分析以及软件质量评估等方面具有...
这个库的名字"javassist"是"Java Class Assistance"的缩写,它提供了一种简单的方法来操作和转换Java字节码。在标题"javassist-rel_3_20_0_ga-22-gccddf79"中,我们可以看到版本号3.20.0-GA,这是一个发布版本,"ga...
Java Reflection是一种强大的编程工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息,甚至可以调用私有方法和访问私有变量。本解析器专注于利用Reflection技术来自动化逆向工程过程,生成类间方法的...
在Java中,注解是一种元数据,用于提供有关程序元素(如类、方法、字段等)的附加信息。注解本身并不改变程序的行为,但它们可以被工具或框架用来指导编译时或运行时的行为。 **1.2 常用注解** - **`@Override`**...
动态代理是Java中用于在运行时创建代理对象的一种机制,它允许我们在程序执行过程中动态地创建代理类并实现特定接口,从而在调用目标方法之前或之后添加额外的功能。动态代理通常用于实现如AOP(面向切面编程)中的...
Android热补丁动态修复技术是一种在不重新安装应用的情况下修复应用程序中bug的方法,它极大地提高了修复效率和用户体验。本文主要介绍了如何在Android环境中实现热补丁修复,特别是针对基础方法类的修复。 首先,...
Java实现Tiger语言编译器是一项涉及计算机科学与软件工程领域的复杂任务,主要涉及到编译原理、Java编程语言以及一种名为Tiger的语言。Tiger是一种教学目的的中级编程语言,设计用于展示现代编译器技术的关键概念。...
首先,Class文件是以二进制格式存储的,其结构遵循一种固定的布局,这种布局被称为“魔数”(Magic Number)开始,用来标识这是Java的Class文件。紧随其后的是版本信息,包括类文件的版本号和JVM的版本号,这些信息...
1. **源代码解析器**:这部分负责将Java源代码转换为抽象语法树(AST),这是对源代码结构的一种抽象表示,便于后续处理。 2. **字节码生成器**:基于解析出的AST,此模块会生成对应的字节码指令序列。这需要对JVM...
在Java开发过程中,这种工具通常被称为代码生成器或者元编程工具,是开发流程增强工具的一种。 **元编程**是指在程序运行期间动态生成、修改其他程序的能力。在Java中,元编程可以通过反射、ASM、Javassist等库来...