以下代码需要asm-5.0.2.jar和asm-commons-5.0.2.jar两个包。
package com.shihuan.field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.prefs.NodeChangeEvent;
import java.util.spi.LocaleNameProvider;
import java.util.spi.TimeZoneNameProvider;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
public class AccountField {
int mynum;
static java.util.Date mydate;
Long mu370;
static Float mfhj;
byte[] mybb;
java.sql.Timestamp[][] parameterTt;
static final int ABCDEF = 0;
boolean bingop;
java.io.InputStream[] islk;
private int myinnn;
protected boolean isServer;
public static final String BUIO = "1999999999999999999999999999999999999";
String sql = "select * from tables";
public AccountField() {
}
public AccountField(boolean bingop) {
this.bingop = bingop;
}
public void operation() {
System.out.println("shihuan operation...");
}
int executeInternal() {
System.out.println("shihuan executeInternal...");
if (true) {
return 2;
}
return 1;
}
}
package com.shihuan.field;
public class TestAccountField {
public static void main(String[] args) {
AccountField t = new AccountField();
t.operation();
t.executeInternal();
}
}
运行AsmDeleteField.java会删除掉AccountField.java文件中的mynum属性:
package com.shihuan.field;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Opcodes;
public class AsmDeleteField {
public static void main(String[] args) throws IOException {
ClassReader cr = new ClassReader("com.shihuan.field.AccountField");
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
if("mynum".equals(name)) { //值域变量名称为mynum的时候
return null; //为null表示去掉
}
return super.visitField(access, name, desc, signature, value); //不为null,保留
}
};
cr.accept(cv, ClassReader.SKIP_DEBUG);
byte[] code = cw.toByteArray();
OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class");
fos.write(code);
fos.close();
}
}
运行AsmDeleteField.java会在AccountField.java文件中添加一个公有int类型的mynum属性:
package com.shihuan.field;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
public class AsmAddField {
public static void main(String[] args) throws IOException {
ClassReader cr = new ClassReader("com.shihuan.field.AccountField");
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
public void visitEnd() {
visitField(Opcodes.ACC_PUBLIC, "mynum", Type.getDescriptor(int.class), null, null); //添加一个名字为mynum的int类型的公有属性
super.visitEnd();
}
};
cr.accept(cv, ClassReader.SKIP_DEBUG);
byte[] code = cw.toByteArray();
OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class");
fos.write(code);
fos.close();
}
}
分享到:
相关推荐
- **继承特点**:Java支持单一继承,但一个类可以通过实现多个接口来模拟多重继承。 - **父类与子类的关系**:子类继承父类的属性和方法,并可添加新的方法或覆盖已有的方法。 - **构造对象的顺序**:首先构造父类...
* JVM(Java Virtual Machine):Java 虚拟机,负责将 Java 字节码转换为机器码并执行。 * Javac:Java 编译命令,用于将 Java 源代码编译成字节码。 * Java:Java 解释命令,用于将字节码文件解释成机器码并执行。 ...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
3. **Java虚拟机(JVM)**:JVM是Java的核心,它负责解释和执行Java字节码,使得Java程序具有跨平台的能力。 4. **Java应用程序接口(Java API)**:提供了大量的预定义类和方法,供开发者在编写Java程序时使用。 ...
### Asm-Guide:Java字节码工程库详解 #### 一、引言 ##### 1.1 动机 Asm 3.0 是一个用于处理 Java 字节码的库,它允许开发者以编程方式读取、创建和修改字节码。此库的出现主要是为了解决以下几方面的需求: - ...
1. Java基础知识:Java源文件通过编译器转换成字节码文件(.class),然后由Java虚拟机(JVM)执行。基本数据类型包括整型(int)、布尔型(boolean)等,以及它们的包装类。Java的方法(methods)是实现特定功能的代码...
- JVM是Java程序运行的环境,它负责解析.class文件,执行字节码,并处理内存管理。JVM内存主要分为堆内存(用于存储对象实例)、栈内存(存储方法调用及局部变量)和方法区(存储类信息)等几个区域。 - 类加载器...
Java虚拟机(JVM)是Java程序的运行环境,负责解析字节码并执行。类加载器负责将类加载到JVM中,包括Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。 **标准库** Java标准库(Java API)提供了...
4. **继承**:Java支持单一继承,即一个子类只能继承一个父类。继承使得子类可以复用父类的属性和方法,同时也可覆盖或扩展父类的功能。 5. **异常处理**:Java使用try-catch-finally结构处理异常,异常是程序运行...
Java的源代码文件以.java为扩展名,通过Java编译器(javac)编译成字节码(.class文件),这些字节码可以在任何安装了Java虚拟机(JVM)的平台上运行,实现了“一次编写,到处运行”的理念。 在Java中,一切皆为...
ProGuard是一款开源的Java字节码混淆、优化和预校验工具。它能够重命名类、方法和字段,使其变得难以理解,同时还能删除无用的代码,从而减小最终的jar或apk文件大小,提高运行效率。下面我们将深入探讨ProGuard的...