- 浏览: 548083 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
下面这个是用 ASM 工具为 Student 类添加一个 public String 类型的 address 属性:
1,需要添加属性的原始类:Student.java
Java codepublic class Student {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2,添加属性的适配器:AddFieldAdapter.java
Java codeimport org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
public class AddFieldAdapter extends ClassAdapter {
private int accessModifier;
private String name;
private String desc;
private boolean isFieldPresent;
public AddFieldAdapter(ClassVisitor cv, int accessModifier, String name, String desc) {
super(cv);
this.accessModifier = accessModifier;
this.name = name;
this.desc = desc;
}
@Override
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
if (name.equals(this.name)) {
isFieldPresent = true;
}
return cv.visitField(access, name, desc, signature, value);
}
@Override
public void visitEnd() {
if (!isFieldPresent) {
FieldVisitor fv = cv.visitField(accessModifier, name, desc, null, null);
if (fv != null) {
fv.visitEnd();
}
}
cv.visitEnd();
}
}
3,添加属性的工具 AddField.java
Java codeimport java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
public class AddField {
private Class clazz = null;
private ClassReader cr = null;
private ClassWriter cw = null;
private ClassAdapter ca = null;
private File classFile = null;
private final static String CLASS_FILE_SUFFIX = ".class";
public AddField(Class clazz) {
this.clazz = clazz;
}
/**
* 添加一个 public 的类成员
* @param fieldName 类成员名
* @param fieldDesc 类成员类型描述
*/
public void addPublicField(String fieldName, String fieldDesc) {
if(cr == null) {
try {
cr = new ClassReader(clazz.getCanonicalName());
} catch (IOException e) {
e.printStackTrace();
}
cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
}
if(ca == null) {
ca = new AddFieldAdapter(cw, Opcodes.ACC_PUBLIC, fieldName, fieldDesc);
} else {
ca = new AddFieldAdapter(ca, Opcodes.ACC_PUBLIC, fieldName, fieldDesc);
}
}
/**
* 将字节码写入类的 .class 文件
*
*/
public void writeByteCode() {
cr.accept(ca, ClassReader.SKIP_DEBUG);
byte[] bys = cw.toByteArray();
OutputStream os = null;
try {
os = new FileOutputStream(getFile());
os.write(bys);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获得类文件的 File 对象
* @return
*/
private File getFile() {
if(classFile == null) {
StringBuffer sb = new StringBuffer();
sb.append(clazz.getResource("/"))
.append(clazz.getCanonicalName().replace(".", File.separator))
.append(CLASS_FILE_SUFFIX);
classFile = new File(sb.substring(6));
}
return classFile;
}
}
4,字节码处理:PreCompileProcess.java
Java codepublic class PreCompileProcess {
public static void main(String[] args) {
// 为 Student 添加字段
AddField add = new AddField(Student.class);
// 添加一个名为 address,类型为 java.lang.String 的 public 字段
add.addPublicField("address", "Ljava/lang/String;");
// 再增加一个名为 tel,类型为 int 的 public 方法
add.addPublicField("tel", "I");
// 重新生成 .class 文件
add.writeByteCode();
}
}
5,测试类:Test.java
Java codepublic class Test {
public static void main(String[] args) {
Student stu = new Student();
stu.setAge(10);
stu.setName("Tom");
stu.address = "Beijing"; // 新增加的 address 字段
stu.tel = 56; // 新增加的 tel 字段
System.out.println("Name: " + stu.getName());
System.out.println("Age: " + stu.getAge());
System.out.println("Address: " + stu.address);
System.out.println("Tel: " + stu.tel);
}
}
上面的代码需要 ASM 工具才能进行编译,ASM 可以到 http://asm.objectweb.org/ 上面去下载。
执行顺序:
javac Student.java
javac -cp .;lib/asm-all-3.1.jar PreCompileProcess.java
java -cp .;lib/asm-all-3.1.jar PreCompileProcess
javac Test.java
java Test
在 Student.java 没有修改的情况下,PreCompileProcess 只需要执行一次就可以了。
发表评论
-
使用Java调用谷歌搜索
2013-10-19 12:50 903转自:http://yangshangchuan.iteye ... -
走出类加载器迷宫
2013-10-16 14:22 691这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜 ... -
Log4j使用
2012-12-05 11:34 785... -
Java的JDBC数据库连接池实现方法
2012-09-14 10:20 744虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库 ... -
什么是线程安全和线程不安全
2012-08-23 14:49 796什么是线程安全和线程 ... -
线程运行栈信息的获取
2012-08-23 14:49 834线程运行栈信息的获取 ... -
log4j 获取行号
2012-08-23 14:50 1163log4jjava 今天看log4j的日志,突然注意到log ... -
javassist【动态改字节码】学习三
2012-08-23 14:50 2670这里举个简单的例子,来记录下如何用CtClass创建一个类,并 ... -
javassist【动态改字节码】学习二
2012-08-22 11:53 840写了个例子。 有一个类: Java代码 package ... -
javassist[动态改字节码]学习一
2012-08-22 11:52 906前段时间为了公司里的 ... -
JVM启动参数
2012-08-22 11:51 948一、标准参数 1.-server -client 虚拟机服务器 ... -
使用javassist动态注入代码
2012-08-22 11:33 789关于java字节码的处理,目前有很多工具,如bcel,asm。 ... -
利用javaassist修改Class文件
2012-08-22 11:22 1505我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的 ... -
JavaMail
2012-08-16 20:03 952在Java EE应用程序中,经常需要发送E-mail。Java ... -
让java变成脚本语言
2012-08-15 12:42 0今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改 ... -
JavaAgent
2012-08-13 23:43 1279-javaagent 这个JVM参数是JDK 5引进的. j ... -
在Eclipse RCP中实现控制反转(IoC)
2012-08-13 23:13 973摘要:这篇文章描述了 ... -
aop的几种实现方式
2012-08-05 21:14 9491 AOP各种的实现 AOP就是面向切面编程,我们可以从 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-28 21:36 597http://www.iteye.com/magazines/ ... -
java基础拾遗
2012-06-17 10:05 883. 电梯直达 楼主 发表于 2012-1-28 13: ...
相关推荐
asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...
ASM1064是一款高性能的PCI Express to SATA 3.0桥接芯片,由ASMIC公司设计制造。这款芯片主要用于实现PCI Express接口与SATA接口之间的数据高速传输,广泛应用于存储扩展卡、固态硬盘控制器等领域。以下是关于ASM...
ASM 1351 是一款由ASMedia( ASM 微电子)公司开发的集成电路,主要应用于数据传输和接口控制领域。这个压缩包“ASM 1351.zip”包含了与ASM 1351相关的三个关键文件:一个固件升级工具、数据表以及设计套件。 1. **...
kmod-oracleasm-2.0.8-15.el6_9.x86_64 oracleasm-support-2.1.8-1.el6.x86_64 oracleasmlib-2.0.4-1.el6.x86_64 安装顺序: rpm -ivh kmod-oracleasm-2.0.8-15.el6_9.x86_64.rpm rpm -ivh oracleasm-support-2.1.8...
【标题】"cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar" 提供的是一组用于Java编程的库,它们主要用于实现动态代理和字节码操作。 【描述】"cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-...
ASM文件的扩展名通常为`.asm`,它允许程序员对计算机硬件进行精确控制,尽管相比高级语言,学习曲线较为陡峭,但在某些特定场景,如系统编程或优化代码时,汇编语言显得尤为重要。 【asm.acp】和【asm.stx】是...
这套工具包括了ASM、ASM-Util、ASM-TREE和ASM-ANALYSIS等组件,每个都有其特定的功能和用途。 **ASM库**是核心部分,提供低级别的API来生成和解析Java字节码。ASM库允许开发者直接操作字节码,创建和修改类,甚至在...
asm-util-1.3.4.jar, asm-util-1.3.5.jar, asm-util-1.4.1.jar, asm-util-1.4.3.jar, asm-util-1.5.1.jar, asm-util-1.5.2.jar, asm-util-1.5.3.jar, asm-util-2.0.jar, asm-util-2.1.jar, asm-util-2.2.1-sources....
包含如下oracleasm包: kmod-oracleasm-2.0.6.rh1-3.el6.x86_64.rpm oracleasm-2.0.8-4.el6_6.src.rpm oracleasm-2.0.8-6.el6_7.src.rpm oracleasm-2.0.8-8.el7.src.rpm oracleasm-2.0.8-15.el7.centos.src.rpm ...
### asm操作指南(中文)知识点总结 #### 一、ASM框架简介 - **定义与功能**:ASM是一个Java字节码操纵框架,主要用于动态生成类或增强现有类的功能。通过直接生成二进制`.class`文件,ASM能够在类被加载到Java...
ASM1061是一款由ASMtek(Asmedia Technology Inc.)公司生产的高性能PCI Express (PCIe) to Serial Advanced Technology Attachment (SATA)桥接芯片,主要用于扩展计算机系统的SATA接口,使得硬件开发人员能够轻松地...
### FIDO UAF框架中ASM API详解 #### 1. 概述 FIDO (Fast IDentity Online) 是一种开放协议,旨在减少对密码的依赖并提供更安全的身份验证方式。UAF (Universal Authentication Framework) 是FIDO联盟推出的一个...
在本案例中,我们关注的是ASM330LHH,这是一款高性能的三轴加速度计和三轴陀螺仪传感器,由意法半导体(STMicroelectronics)制造。ASM330LHH广泛应用于运动检测、航姿参考系统、手势识别以及物联网设备中的动态平衡...
ASM1083 PCIe转PCI芯片数据表 ASM1083 PCIe转PCI芯片数据表是ASMedia TECHNOLOGY INC.公司出品的一款PCIe转PCI桥接芯片,其主要功能是将PCI Express(Peripheral Component Interconnect Express)接口转换为传统的...
在标题提到的"C-include-ASM.zip_asm中include_asm_c语言中嵌套asm",我们主要讨论的是如何在C程序中使用汇编代码,并且可能涉及到如何在汇编代码中包含其他汇编模块。 首先,让我们了解一下C语言嵌套汇编的基本...
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class ...
**汇编插件 AsmDude 用于 Visual Studio 2022** AsmDude 是一款专为Visual Studio 2022设计的汇编语言插件,它极大地提升了开发人员在使用汇编语言时的工作效率和代码质量。这款插件对新手极其友好,即使是编程经验...
ASM1061是一款广泛应用在PCI-E到SATA转换中的控制器芯片,由ASMtek公司生产。这个"ASM1061资料文件.rar"压缩包包含了关于该芯片的详细设计资料,对于开发者、工程师或者硬件爱好者来说是极其宝贵的资源。下面我们将...
### Oracle 不使用 OracleASM 的包配置 ASM 磁盘配置方法 #### 概述 在 Oracle 数据库系统中,自动存储管理(ASM)是用于管理数据库文件的一种高性能、高可用性的解决方案。通常情况下,ASM 依赖于 Oracle 提供的 ...
《ASM330LHH1陀螺仪:高精度数据手册解析》 ASM330LHH1是一款高性能的固态陀螺仪,主要用于需要精确测量角速度的应用中。这款陀螺仪以其卓越的精度和稳定性,广泛应用于无人机、机器人导航、虚拟现实设备以及各类...