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

Java字节码删除或者添加一个类方法

    博客分类:
  • asm
阅读更多
以下代码需要asm-5.0.2.jar和asm-commons-5.0.2.jar两个包。

package com.shihuan.method;

public class AccountMethod {

	String sql = "select * from tables";

	public AccountMethod() {
		
	}
	
	public AccountMethod(String sql) {
		super();
		this.sql = sql;
	}

	public void operation() {
        System.out.println("shihuan operation...");
    }
	
	int executeInternal() {
		
		System.out.println("shihuan executeInternal...");
		
		if (true) {
			System.out.println(this.sql);
			return 2;
		}
		
		return 3;
	}
	
}


package com.shihuan.method;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;

public class AsmAddMethod {

	public static void main(String[] args) throws IOException {
		
		ClassReader cr = new ClassReader("com.shihuan.method.AccountMethod");
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
        ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw){};
        cr.accept(cv, Opcodes.ASM5);
        
      //新增加一个方法
        MethodVisitor mw= cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
                "add",
                "([Ljava/lang/String;)V",
                null,
                null);
        // pushes the 'out' field (of type PrintStream) of the System class
        mw.visitFieldInsn(Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;");
        // pushes the "Hello World!" String constant
        mw.visitLdcInsn("this is add method print!");
        // invokes the 'println' method (defined in the PrintStream class)
        mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println",
                "(Ljava/lang/String;)V", false);
        mw.visitInsn(Opcodes.RETURN);
        // this code uses a maximum of two stack elements and two local
        // variables
        mw.visitMaxs(0, 0);
        mw.visitEnd();
        
		byte[] code = cw.toByteArray();
		OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/method/AccountMethod.class");
		fos.write(code);
		fos.close();

	}

}


package com.shihuan.method;

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.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class AsmDeleteMethod {

	public static void main(String[] args) throws IOException {
		ClassReader cr = new ClassReader("com.shihuan.method.AccountMethod");
		ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
		ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
			
			public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
				if("executeInternal".equals(name)) {
		            return null;
		        }
				return super.visitMethod(access, name, desc, signature, exceptions); //不为null,保留
		    }
			
		};
		cr.accept(cv, ClassReader.SKIP_DEBUG);

		byte[] code = cw.toByteArray();
		OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/method/AccountMethod.class");
		fos.write(code);
		fos.close();
	}

}


AsmAddMethod2.java这种方式会清空掉AccountMethod.java文件中的所有内容,然后加入新方法,一般用的情况比较少。
package com.shihuan.method;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;

public class AsmAddMethod2 {

	public static void main(String[] args) throws IOException {

		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
		cw.visit(38, Opcodes.ACC_PUBLIC, "com.shihuan.method.AccountMethod", null, "java/lang/Object", null);
		Method m = Method.getMethod("void <init> ()");
		GeneratorAdapter ga = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m, null, null, cw);
		ga.loadThis();
		ga.invokeConstructor(Type.getType(Object.class), m);
		ga.returnValue();
		ga.endMethod();

		m = Method.getMethod("void doSomething()");
		ga = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m, null, null, cw);
		ga.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
		ga.push("动态生成,动态加载调用方法");
		ga.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println(String)"));
		ga.returnValue();
		ga.endMethod();

		byte[] code = cw.toByteArray();
		OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/method/AccountMethod.class");
		fos.write(code);
		fos.close();

	}

}
分享到:
评论

相关推荐

    java字节码例子 可以动态修改类 bcel

    Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够理解的低级指令集,每条字节码指令对应一种特定的操作。在Java中,我们可以使用字节码技术来...

    JAVA字节码操作库 BCEL

    BCEL(Byte Code Engineering Library)是Java开发的一个重要工具,主要用于处理Java字节码。它为开发者提供了一种深入理解与操作Java类文件的底层机制,允许分析、创建、修改和优化字节码。在软件工程中,BCEL在...

    JByteMod-1.6.1(java字节码编辑器)简介及下载

    使用JByteMod需要一定的Java字节码知识,但它的直观界面和丰富的功能使得这个过程相对平易近人。无论是开发、调试还是研究,JByteMod都是一个强大的工具,能够帮助开发者更深入地理解和操作Java程序。

    java源码:JAVA字节码操作库 BCEL.zip

    Java字节码操作库BCEL(Byte Code Engineering Library)是一个强大的工具,用于分析、修改和创建Java类文件。它是Apache软件基金会的Jakarta项目的一部分,为开发者提供了对字节码的底层控制,使得开发者能够在运行...

    javassist试图简化Java字节码的编辑

    Java字节码编辑是Java开发中的一个高级主题,它允许开发者在运行时修改或增强类的行为。`javassist`库正是这样一个工具,它为Java字节码操作提供了一个简洁的API,试图降低这个过程的复杂性。在Java世界中,字节码...

    JAVA字节码操作库 BCEL.7z

    **JAVA字节码操作库 BCEL** BCEL(Byte Code Engineering Library)是Java平台上的一款开源库,主要用于处理Java字节码。它提供了对字节码的解析、创建、修改和分析的能力,使得开发者能够深入理解并操作Java类文件...

    JAVA字节码编辑工具.zip

    这个工具允许开发者直接对这些字节码进行修改,提供了深入到程序底层操作的可能性,对于调试、优化或者学习Java字节码有极大的帮助。 "JDK8亲测可用"表明这个工具至少兼容到Java 8版本,这意味着它应该能处理基于...

    java字节码框架ASM操作字节码的方法浅析

    Java字节码框架ASM是一个强大的库,它允许程序员在运行时动态生成和修改Java类和接口的字节码。ASM提供了对JVM字节码的底层访问,这使得开发者能够实现诸如AOP(面向切面编程)或者元编程等高级功能。 首先,我们...

    javassist,Java字节码工程工具包.zip

    Java字节码工程工具包,通常被称为Javassist,是一个强大的开源项目,它为Java开发者提供了在运行时操作和分析类以及字节码的能力。这个工具包被广泛应用于动态代理、AOP(面向切面编程)、代码生成以及单元测试等...

    jclasslib 修改class字节码工具

    `jclasslib` 是一款强大的Java字节码查看和编辑工具,尤其适合Java开发者在处理已编译的`.class`文件时使用。它允许我们深入理解类文件的结构,甚至对字节码进行修改,这对于调试、优化、学习Java虚拟机(JVM)的...

    Gradle Plugin 修改其class 字节码的Demo

    在上述代码中,`MyClassAdapter`是一个实现了`MethodVisitor`接口的类,它会遍历类中的每个方法,并根据需求添加、修改或删除字节码指令。这就是我们实际修改字节码的地方。 总结来说,通过创建Gradle插件并利用...

    Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强

    接下来,我们引入ASM库,这是一个强大的Java字节码操控和分析框架。ASM允许开发者在运行时动态生成和修改类。通过ASM,我们可以: - 创建全新的类、接口或继承已有类的子类。 - 修改已有的类,添加、删除或修改方法...

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行时或编译时方便地修改Java类。通过Javassist,我们能够动态创建新的类、接口,或者修改已存在的类的结构,包括添加、修改或删除方法和字段。...

    java字节码框架ASM的深入学习

    ASM是一个底层的库,它直接操作Java字节码,这使得开发者能够在运行时改变类的行为或创建新的类。本文将深入探讨ASM框架的核心概念、如何使用ASM以及一个简单的代码示例。 一、ASM框架介绍 ASM是一个开源的Java...

    JAVA字节码操作库 BCEL源码

    Java字节码操作库BCEL(Byte Code Engineering Library)是Apache软件基金会提供的一个开源项目,主要用于解析、生成和修改Java字节码。在深入理解BCEL之前,我们首先要明白Java字节码的概念。Java字节码是Java源...

    java修改class文件工具jbe

    Java 修改 Class 文件工具有很多,其中“JBE”(全称可能为 Java Bytecode Editor 或类似)是一个专门用于查看和编辑 Java 字节码的工具。它允许开发者在编译后的级别上操作 Java 类,这对于调试、逆向工程、优化...

    JAVAAssist jar包 ,最新发布,4月16号更新

    JavaAssist是一个强大的Java字节码操作库,它允许开发者在运行时动态地修改或创建新的Java类。这个jar包的最新版本是在4月16日更新的,提供了最新的功能和改进,对于需要进行字节码操作的Java开发工作尤其有用。 在...

    字节码增强在货拉拉监控领域的大规模落地与其他应用场景探索共

    这些库能够解析并操作Java字节码,允许在运行时动态插入、修改或删除代码片段。例如,ASM是一个底层的字节码操作框架,可以直接生成和分析字节码;ByteBuddy则提供了一种更友好的API,使得字节码增强过程更为简洁;...

    java 反编译工具 jboss-javassist

    Java反编译工具JBoss Javassist是一款强大的Java字节码操作库,它允许程序员在运行时修改类或者创建新的类。Javassist是Java字节码操纵和分析框架,常用于动态代理、AOP(面向切面编程)以及逆向工程等场景。通过这...

    java代码、变量、常量修改工具(附使用方法).rar

    JBE是一个开源的字节码编辑器,它支持对Java字节码进行直接编辑,包括修改方法体、常量池、添加或删除类、方法和字段。与JClassLib类似,JBE为没有源代码的Java程序提供了一种修改机制,特别适用于逆向工程、调试和...

Global site tag (gtag.js) - Google Analytics