`
shihuan830619
  • 浏览: 583902 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java字节码删除或者添加一个类成员

    博客分类:
  • asm
阅读更多
以下代码需要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笔记 java笔记

    - **继承特点**:Java支持单一继承,但一个类可以通过实现多个接口来模拟多重继承。 - **父类与子类的关系**:子类继承父类的属性和方法,并可添加新的方法或覆盖已有的方法。 - **构造对象的顺序**:首先构造父类...

    java单词java单词.doc

    * JVM(Java Virtual Machine):Java 虚拟机,负责将 Java 字节码转换为机器码并执行。 * Javac:Java 编译命令,用于将 Java 源代码编译成字节码。 * Java:Java 解释命令,用于将字节码文件解释成机器码并执行。 ...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包9

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包101

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包10

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包1

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包3

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    Java资源包01

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java简介及基本知识

    3. **Java虚拟机(JVM)**:JVM是Java的核心,它负责解释和执行Java字节码,使得Java程序具有跨平台的能力。 4. **Java应用程序接口(Java API)**:提供了大量的预定义类和方法,供开发者在编写Java程序时使用。 ...

    Asm-Guide

    ### Asm-Guide:Java字节码工程库详解 #### 一、引言 ##### 1.1 动机 Asm 3.0 是一个用于处理 Java 字节码的库,它允许开发者以编程方式读取、创建和修改字节码。此库的出现主要是为了解决以下几方面的需求: - ...

    《HEADFIRSTJAVA》--深入浅出Java说明与归纳.pdf

    1. Java基础知识:Java源文件通过编译器转换成字节码文件(.class),然后由Java虚拟机(JVM)执行。基本数据类型包括整型(int)、布尔型(boolean)等,以及它们的包装类。Java的方法(methods)是实现特定功能的代码...

    《Java面试手册》.pdf

    - JVM是Java程序运行的环境,它负责解析.class文件,执行字节码,并处理内存管理。JVM内存主要分为堆内存(用于存储对象实例)、栈内存(存储方法调用及局部变量)和方法区(存储类信息)等几个区域。 - 类加载器...

    hannuota JAVA

    Java虚拟机(JVM)是Java程序的运行环境,负责解析字节码并执行。类加载器负责将类加载到JVM中,包括Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。 **标准库** Java标准库(Java API)提供了...

    JAVA面试题.docx

    4. **继承**:Java支持单一继承,即一个子类只能继承一个父类。继承使得子类可以复用父类的属性和方法,同时也可覆盖或扩展父类的功能。 5. **异常处理**:Java使用try-catch-finally结构处理异常,异常是程序运行...

    JAVA基础教程以及相关题库

    Java的源代码文件以.java为扩展名,通过Java编译器(javac)编译成字节码(.class文件),这些字节码可以在任何安装了Java虚拟机(JVM)的平台上运行,实现了“一次编写,到处运行”的理念。 在Java中,一切皆为...

    利用混淆器ProGuard混淆java类,防止反编译

    ProGuard是一款开源的Java字节码混淆、优化和预校验工具。它能够重命名类、方法和字段,使其变得难以理解,同时还能删除无用的代码,从而减小最终的jar或apk文件大小,提高运行效率。下面我们将深入探讨ProGuard的...

Global site tag (gtag.js) - Google Analytics