Java如何修改.class文件变量

最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.class文件

idea安装jclasslib-bytecode-viewer插件

标准方式安装插件

准备要修改的.class文件

这里我们写一个简单的java方法

/**
 * @Description:
 * @author: wei.wang
 * @since: 2020/9/5 11:18
 * @history: 1.2020/9/5 created by wei.wang
 */
public class HelloWorld {
  public static void main(String[] args) {
    String word = "Hello World";
    System.out.println(word);
  }
}

查找要修改的变量

打开要修改的.class文件,点击view->Show Bytecode With Jclasslib ,在Constants Pool中使用Text filter功能找到要修改的内容,我们发现有一个String类型常量,指向23,点击23就能看到要修改的内容

修改.class文件中的变量

23是要修改的内容

/**
 * @Description:
 * @author: wei.wang
 * @since: 2020/9/4 19:42
 * @history: 1.2020/9/4 created by wei.wang
 */

import java.io.*;

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class Test {
  public static void main(String[] args) throws Exception {

    String filePath = "F:\\GitCode\\zero\\test111\\target\\classes\\HelloWorld.class";
    FileInputStream fis = new FileInputStream(filePath);

    DataInput di = new DataInputStream(fis);
    ClassFile cf = new ClassFile();
    cf.read(di);

    CPInfo[] infos = cf.getConstantPool();

    int count = infos.length;
    System.out.println(count);

    for (int i = 0; i < count; i++) {
      if (infos[i] != null) {
        System.out.print(i);
        System.out.print(" = ");
        System.out.print(infos[i].getVerbose());
        System.out.print(" = ");
        System.out.println(infos[i].getTagVerbose());
        //对23进行修改
        if(i == 23){
          ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
          uInfo.setBytes("Hello World HELLO WORLD".getBytes());
          infos[i]=uInfo;
        }
      }
    }

    cf.setConstantPool(infos);
    fis.close();
    File f = new File(filePath);
    ClassFileWriter.writeToFile(f, cf);
  }
}

执行结果

可以看到已经修改完成

public class HelloWorld {
  public HelloWorld() {
  }

  public static void main(String[] args) {
    String word = "Hello World HELLO WORLD";
    System.out.println(word);
  }
}

以上就是Java如何修改.class文件变量的详细内容,更多关于Java修改文件变量的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java反射如何修改private final成员变量值

    大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 /** * @author Cool-Coding 2018/5/15 */ public class ReflectionUsage {private final int age=18; public int getAge(){ return age; } } 测试代码: import java.lang.refl

  • Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常

    今天做了一个Map转java对象的例子,用了一种比较简单的方法,就是通过net.sf.cglib.beans.BeanMap类中的方法进行转换.结果在一切准备就绪,执行的时候报错了,如下: Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184) at net.

  • Java泛型的用法及T.class的获取过程解析

    这篇文章主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 胡乱总结泛型的四点作用: 第一是泛化,可以拿个T代表任意类型. 但GP是被C++严苛的静态性逼出来的,落到Java.C#这样的花语平原里----所有对象除几个原始类型外都派生于Object,再加上Java的反射功能,Java的Collection库没有范型一样过得好好的. 第二是泛型 + 反射,原本因为Java的泛型拿不到T.cla

  • IntelliJ IDEA引入第三方jar包或查看Java源码的时候报decompiled.class file bytecode version:52.0(java 8)错误的解决办法

    引入第三方jar包或者查看Java源码的时候,经常遇到问题如下: decompiled.class file bytecode version:52.0(java 8) ,open source file. 翻译一下上面的意思:(反编译 .class文件中的字节码 到Java 8 版本) 打开源文件 其实这个时候,你就得注意一下,你看到文件是 .class文件,还是 .java文件. 然后我就详细的总结了一下,二者的差别: 1.先是理论知识: .java为Java的源文件后缀,编写的代码需要写在

  • 浅谈java中类名.class, class.forName(), getClass()的区别

    Class对象的生成方式如下: 1.类名.class    说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Class.forName("类名字符串")  (注:类名字符串是包名+类名) 说明:装入类,并做类的静态初始化,返回Class的对象 3.实例对象.getClass()  说明:对类进行静态初始化.非静态初始化:返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Cla

  • 一键设置java 环境变量 cmd下查看、修改(覆盖与添加)等说明

    上来就给点干货吧 安装JDK/安装JRE以及配置java环境变量对于java初学者来说是一件比较头疼的事情,这边分享一个简单的批处理命令,助大家一步完成JDK或者单独安装JRK的需求. 关键步骤: 1.新建一个.txt文档,复制附件一/附件二到文档中: 2.修改文档中的内容: 附件一:start /WAIT jdk-8u141-windows-i586.exe /qn INSTALLDIR=C:\Java\jdk1.8 附件二:start /WAIT jre-8u144-windows-i586

  • Android Caused by: java.lang.ClassNotFoundException解决办法

    Android Caused by: java.lang.ClassNotFoundException解决办法 出现问题: 08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX    in loader dalvik.system.PathClassLoader[/data/app/XXXX.apk] 我想大家经常因为疏忽出现ClassNotFoundExcept

  • 浅谈Linux下修改/设置环境变量JAVA_HOME的方法

    1. 永久修改,对所有用户有效 # vi /etc/profile //按键盘[Shift + g], 在profile文件最后添加下面的内容: JAVA_HOME=/usr/local/java/jdk1.7.0_25 JRE_HOME=$JAVA_HOME/jre CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$JAVA_HOME/bin:$PATH export PATH JAVA_HOME JRE_HOME C

  • Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常

    今天做了一个java对象转Map的例子,执行的时候报错了,如下: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/Transformer  at java.lang.ClassLoader.defineClass1(Native Method)  at java.lang.ClassLoader.defineClass(ClassLoader.java:6

  • Java如何修改.class文件变量

    最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.class文件 idea安装jclasslib-bytecode-viewer插件 标准方式安装插件 准备要修改的.class文件 这里我们写一个简单的java方法 /** * @Description: * @author: wei.wang * @since: 2020/9/5 11:18 * @history: 1.2020/9/5 created by

  • linux下用renameTo方法修改java web项目中文件夹名称的实例

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服务器上一直无法实现功能,自己一直在捣鼓,以为是window环境和Linux环境不同的原因导致,后面发现在项目中使用renameTo方法修改文件夹名称不行是因为之前改了java web项目中的js,在js中传入值到后台,后台根据值来修改文件夹名称.由于没清除缓存导致js中的代码没有刷新,所以一直出现错

  • Java实现的properties文件动态修改并自动保存工具类

    本文实例讲述了Java实现的properties文件动态修改并自动保存工具类.分享给大家供大家参考,具体如下: 一.概述 利用commons-configuration读取配置文件,并实现对配置文件的动态修改和自动保存. Apache Common-Configuration工具可以从 Properties文件,XML文件,JNDI,JDBC数据源,System Properties,Applet parameters,Servlet Parameters等读取相应信息 使用步骤 前提,引入co

  • python调用java模块SmartXLS和jpype修改excel文件的方法

    本文实例讲述了python调用java模块SmartXLS和jpype修改excel文件的方法.分享给大家供大家参考.具体实现方法如下: # -*- coding: utf8 -*- """ 使用java的模块SmartXLS和jpype修改excel 和xlrd,xlwt不同的是它可以生成和保持图表 """ from __future__ import print_function, division import os import jpyp

  • Java实现批量修改txt文件名称的方法示例

    本文实例讲述了Java实现批量修改txt文件名称的方法.分享给大家供大家参考,具体如下: 最近在做特征选择的实验时,需要批量修改一下文件名称,在这里做一下记录. package com.cqu.experiment; import java.io.File; /** * @author 作者: E-mail:@126.com * @version 创建时间:2016年12月26日 下午3:02:01 类说明 */ public class RenameTxt { public static vo

  • java如何反编译jar包并修改class文件重新打包

    目录 反编译jar包并修改class文件重新打包 解决思路 jar包反编译后修改源码再编译 1.场景 2.详细步骤 反编译jar包并修改class文件重新打包 这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包 本来是很简单的问题,但是因为这个jar包不是可执行的jar包(没有main方法入口),jar反编译之后又是不能通过idea重新打包,因为jar是混乱的 所以费了点时间,在此记录下 解决思路 反编译jar包 首先用一些反编译工具类似 jad-gui 之类的 ,将项目反编译成

  • 详解五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

  • Java下载安装和环境变量配置图文教程

    初学JAVA时,新手常常不知如何下载JAVA,也不知如何安装JAVA以及对JAVA配置环境变量.近期学弟学妹常请教我如何下载安装和配置JAVA,于是写下此博文以便更多新手快速入门,由于我本人是玩智能车的,因此JAVA知识水平有限,若有不足之处,请大家批评指正.本文可能写的过于繁琐,完全是为新手作为引导. 一.JAVA的下载 1.1JAVA由SUN公司开发,2006年SUN公司宣布将Java技术作为免费软件对外发布,标志着JAVA的公开免费.2009年,SUN公司被甲骨文公司收购,因此我们现在想下

  • 为什么Java开发需要配置环境变量

    之前学习 Java 的时候,感觉最难做的一件事情就是配置 jdk 的环境.那叫一个困难啊,Path, JAVA_HOME, CLASSPATH 印象深刻的很-(但是现在 JDK11 不用再配置 classpath 了,jre 和 jdk 合并了) 就在去年暑假,要配 OpenCV 的环境,要调的东西还是比较多的,对环境配置的概念又加深了. 现在懂的多了,配过的环境也多了,配过的平台也不算少.现在就想分享一下 关于我对配环境这件事情的感受. 那就以 Windows 来说说环境配置的问题,Linux

随机推荐