`
liuzhiyi7288
  • 浏览: 32021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java字节码操作

 
阅读更多

对于Java程序员来说,工作中经常会遇到这样一些问题,比如引用了些第三方提供的非开源jar包,这个时候我们需要用它,甚至需要改它的内容。怎么办?下面看看开发中会遇到哪些问题?

  1. 某个类的里面的字段默认值不符合需求要改掉.
  2. 某个方法里面有很多校验,想直接return ;绕过校验。
  3. 某个方法里面的计算方法太复杂,想用自己的计算方式。替换方法体。
  4. 首先声明一点,如果是收费的,切勿参加商业性质。

       往往这个时候我们就会很棘手,因为确实不好操作,不好处理。现在我给大家介绍两种方式,解决一些比较常见且简单的问题。

1、 反编译class文件,推荐Java Decompiler 
       这个工具几乎能正确的反编译出源代码。如果反编译出的源码,没有出现很明显的错误。或者说很难修改的错误时。通常这个时候我们直接修改该类已达到我们的需求就可以了,把修改后的class文件覆盖jar里的class文件,即可。
不过,有时候第三方提供的jar里面,某些类写的特别复杂,反编译后一堆错误,真的没法修改。这个时候可以试试第二种方法。
 
2、利用工具直接修改class字节码,推荐Javassist
       先给大家介绍一下Javassist,Javassist是一个开源的分析、编辑和创建Java字节码的类库,它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。
 
       关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。
1、我们可以用Javassist实现什么。
  • 添加修改父类
  • 添加修改方法
  • 添加修改字段
  • 创建类
2、准备工作
 
       2.1首先下载Javassist,jar文件
       2.2获得ClassPool对象,他控制者class字节码的修改。
       ClassPool pool = ClassPool.getDefault();
       2.3.如果你准备修改的class文件在某个路径或者jar文件里或者网络的某个路径。需要设置路径
1
2
3
4
5
6
7
pool.insertClassPath("E:\\test");或者提供一个jar文件
pool.insertClassPath("E:\\test.jar");或者提供一个网络路径
ClassPath cp = new URLClassPath("www.javassist.org", 80, "/java/", "org.javassist.");
pool.insertClassPath(cp);或者直接提供byte字节码
byte[] b = a byte array;
String name = class name;
pool.insertClassPath(new ByteArrayClassPath(name, b));
 
       2.4.下面我们就要处理class文件了,每个class文件对应一个CtClass对象,而CtClass是从对象ClassPool对象里得到。需要完整的包名+类名,不需要.class
1
CtClass cc = pool.get("com.my.TestMain");
       2.5.完整代码
1
2
3
4
ClassPool pool = ClassPool.getDefault();
 //pool.insertClassPath("E:\\test.jar");
pool.insertClassPath("E:\\test");
CtClass cc = pool.get("com.my.TestMain");
3、添加修改父类
       3.1.添加接口
       cc.setInterfaces(new CtClass[] { pool.get("com.my.TestMain2") });
       3.2.添加抽象类
1
2
cc.setSuperclass(pool.get("com.my.TestMain1"));
cc.writeFile();
       如果父类已经存在就用现在的类替换了。
       
4、添加修改方法
       4.1.添加新的方法 
1
2
3
4
CtClass cc = pool.get("sample.TestMain");
CtMethod cm = CtNewMethod.make("public void toInt(int i){i++;}", cc);
cc.addMethod(cm);
cc.writeFile()
       4.2.修改方法
1
2
3
CtClass cc = pool.get("sample.TestMain");
CtMethod cm = cc.getDeclaredMethod("toInt", new CtClass[]{ CtClass.intType });
cc.writeFile();
       getDeclaredMethod的第一个参数是方法名,第二个参数是方法的参数。
       获得方法对象后,以下三种方法是最常用的。
  • cm.setBody("");重新设置方法体
  • cm.insertBefore("");在原来方法的最前面插入代码
  • cm.insertAfter("");在原来方法的后面插入代码
       4.3.删除方法
1
cc.removeMethod()
5. 添加修改字段
       5.1.添加字段
1
2
3
4
5
//方式1
CtClass cc = pool.get("sample.TestMain");
CtField f = new CtField(CtClass.intType, "t1", cc);
cc.addField(f, "2");    // initial value is 0.
cc.writeFile();
     //方式2
1
2
3
4
CtClass cc = pool.get("sample.TestMain ");
CtField f = CtField.make("public int z = 0;", point);
cc.addField(f);
cc.writeFile();
       5.2.修改字段,方法里没有提供直接修改,我们需要删删除在修改
1
2
3
4
5
CtClass cc = pool.get("sample.TestMain");
CtField f = cc.getDeclaredField("t");
cc.removeField(f);
cc.addField(CtField.make("public int t=3;", cc));
cc.writeFile();
6. 创建新类
1
2
3
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("Point");
cc.writeFile();
  • 大小: 77.7 KB
分享到:
评论

相关推荐

    JAVA字节码操作库 BCEL

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

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

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

    JAVA字节码操作库 BCEL.7z

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

    ASM Java字节码操作框架

    ASM Java字节码操作框架PPT,结合已有AOP实现方法,对比所有对Java字节码操作方法做比较

    JAVA源码JAVA字节码操作库BCEL

    JAVA源码JAVA字节码操作库BCEL

    java资源JAVA字节码操作库BCEL

    java资源JAVA字节码操作库 BCEL提取方式是百度网盘分享地址

    Java 字节码概述

    Java 字节码操作码可以分为以下几类: * 保留操作码(3) * 装载和存储(71) * 运算指令(42) * 类型转换指令(15) * 操作数栈管理指令(9) * 控制转移指令(23) * 对象创建和操纵指令(27) * 方法调用和返回...

    ASM 帮助文档(java字节码操作)

    ASM 帮助文档(java字节码操作) 对字节码进行操作的jar包。

    Recaf一个现代Java字节码编辑器

    **Recaf:现代Java字节码编辑器** 在Java开发领域,字节码编辑器是一种不可或缺的工具,...在实际使用中,配合其提供的文档和社区资源,开发者可以更深入地掌握Java字节码操作的技巧,提升开发效率和解决问题的能力。

    Java字节码工程工具包.zip

    Java字节码工程工具包Javassist 版本 3版权所有 (C) 1999-2023 Shigeru Chiba,保留所有权利。Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是一个用于编辑 Java 字节码的类库它使 Java 程序能够在运行...

    轻松看懂Java字节码.pdf

    标题《轻松看懂Java字节码.pdf》中隐藏的知识点是理解Java字节码的重要性及如何轻松掌握。描述中提到Java字节码是实现“一次编写,到处运行”(Write Once, Run Anywhere)这一Java承诺的核心技术之一。而标签“Java...

    免费开源!!Java字节码工程工具包

    Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是Java中用于编辑字节码的类库;它使 Java 程序能够在运行时定义新类,并在 JVM 加载时修改类文件。与其他类似的字节码编辑器不同,Javassist 提供两个...

    java字节码加密

    Java字节码加密是保护Java应用程序源代码安全的重要技术手段,主要是为了防止恶意用户逆向工程分析、篡改或盗取程序的核心逻辑。在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机...

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

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

    ASM字节码操作简单实例

    ASM字节码库是Java字节码操作的强大工具,它允许程序员在运行时动态生成类或者增强已有类的功能。在本实例中,我们将探讨如何利用ASM实现简单的面向切面编程(AOP)功能,这是一种在不修改源代码的情况下,添加额外...

    基于java的字节码操作库 BCEL.zip

    Java字节码操作库BCEL(Byte Code Engineering Library)是一个强大的工具,主要用于处理Java字节码,它允许开发者分析、创建、修改以及动态生成类。BCEL是Apache软件基金会下的Jakarta项目的一部分,广泛应用于软件...

    基于Java的字节码操作库 BCEL.zip

    Java字节码操作库BCEL(Byte Code Engineering Library)是一个强大的工具,主要用于处理Java类文件。它提供了对字节码的全面访问和控制,允许开发者分析、修改和创建新的Java类。BCEL在许多领域都有应用,如动态...

    Java字节码转换工具—Retrotranslator

    Java字节码转换工具Retrotranslator是一个用于解决软件兼容性问题的实用工具,尤其是在Java版本升级带来的不兼容性上。随着Java技术的不断迭代,新版本的特性常常不能在旧版本的JDK环境下运行,而Retrotranslator的...

    cglib,字节码生成库是生成和转换Java字节码的高级API。它被aop、测试、数据访问框架用来生成动态代理对象和拦截字段访问。.zip

    CGlib库利用ASM库(一个底层的Java字节码操作和分析框架)来生成和修改字节码。通过这种方式,开发者可以在程序运行时动态地创建新的类或修改现有类的行为,而无需重新编译源代码。 **动态代理** CGlib常用于实现...

Global site tag (gtag.js) - Google Analytics