账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    java反编译后再编译成class时提示缺少包
    52
    0

    问题描述

    我下载了一个对方的Jar程序,可以正常运行,但是我想修改程序里面的一些内容,比如其程序中有一个函数

    public void setNumTarget(final long numTarget) {
        this.numTarget = numTarget;
    }
    我想让其变成类似这样的(当然这只是其中一处想要修改的地方,还有几处稍微复杂点的) 
    public void setNumTarget(final long numTarget) {
        if (numTarget > 5000) {
            this.numTarget = numTarget;
        } else {
            this.numTarget = numTarget * 1000;
        }
    }
    现在我用luyten-0.5.4.exe 这个软件,将.class反编译成 .java文件后,按照我的要求修改了文件,再想调用javac xx.java 来编译成 .class文件时,提示一堆的错误,我看主要的原因是因为缺少其他的包.比如xx.java的内容如下:

    package brs;
    import javax.persistence.*;
    import java.math.*;
    import java.util.concurrent.atomic.*;
    import brs.peer.*;
    import brs.crypto.*;
    import com.google.gson.*;
    import brs.util.*;
    import java.util.*;
    import java.nio.*;
    import org.slf4j.*;
    ......

    问题出现的环境背景及自己尝试过哪些方法

    比如其中的 import javax.persistence.*; 我知道是缺少jar包,我从网上下载了jar包,来一起编译,就没问题了,
    但是其他的比如 import brs.peer.*; 这种引用的他自己内部的包,我没有这个jar文件. 和源码一起的只有对应的.class 文件,没有jar文件, 而且我看.class的名称,也能完全对应上
    这种 我该怎么才能一起编译啊,求教!

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)
    我目前的编译代码:
    C:UsersAdministratorDesktopjava>javac -cp ejb3-persistence.jar;gson-1.7.jar
    Block.java

    你期待的结果是什么?实际看到的错误信息又是什么?

    能够告知我如何处理这种编译呢,谢谢. 我基础有点差,如果能稍微详细点,不胜感激

    报错类似如下内容:
    Block.java:53: 错误: 找不到符号

    private TransactionDb transactionDb() {
            ^

    符号: 类 TransactionDb
    位置: 类 Block
    Logger.java:21: 错误: 找不到符号

    boolean isTraceEnabled(final Marker p0);
                                 ^

    符号: 类 Marker
    位置: 接口 Logger
    Logger.java:23: 错误: 找不到符号

    void trace(final Marker p0, final String p1);
                     ^

    符号: 类 Marker
    位置: 接口 Logger
    Logger.java:25: 错误: 找不到符号

    void trace(final Marker p0, final String p1, final Object p2);
    
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 瞳孔浮华忧伤 普通会员 1楼

      在Java中,反编译和编译成class文件通常涉及以下步骤:

      1. 反编译:
      2. 使用Java的反编译工具,如java -jar 或 gradle compileJava,运行以下命令: bash java -jar your_jar_file.jar --source-path /path/to/your/source/java-files --target-path /path/to/your/target/java-files
      3. 在运行的命令中, -source-path-target-path 参数指定源文件和目标文件的路径,即反编译的目标文件路径。

      4. 在反编译的Java代码中,可能会使用 import 语句导入所需包,例如: ```java import java.io.*; import java.util.Scanner;

        public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);

             System.out.println("Enter the name of the file to be compiled:");
             String fileName = scanner.nextLine();
        
             try {
                 File inputFile = new File(fileName);
                 File outputFile = new File(fileName + ".class");
        
                 // 引入包,如:java.util
                 System.out.println("导入包:java.util");
        
                 // 将源文件反编译为字节码
                 byte[] bytecode = Files.readAllBytes(inputFile.toPath());
                 byte[] classes =反编译(bytecode);
        
                 // 将字节码反编译为目标文件
                 byte[] classesFile = Files.write(outputFile.toPath(), classes);
        
                 System.out.println("Source file " + fileName + " has been compiled to target file " + fileName + ".class");
             } catch (FileNotFoundException e) {
                 System.out.println("Error: " + e.getMessage());
             } catch (IOException e) {
                 System.out.println("Error: " + e.getMessage());
             }
         }
        
         // 将字节码反编译为目标文件
         public static byte[]反编译(byte[] bytecode) throws IOException {
             byte[] classes = new byte[bytecode.length];
        
             // 调用反编译器的API进行字节码反编译
             ClassReader reader = new ClassReader(bytecode);
             ClassWriter writer = new ClassWriter(classes, ClassWriter.COMPUTE_FRAMES);
        
             // 创建反编译器对象
             Field[] fields = reader.getFields();
             for (Field field : fields) {
                 if (!field.isStatic()) {
                     writer.writeField(field.getName(), field.getType(), field.get初始值());
                 }
             }
        
             // 将反编译后的字节码反编译为类文件
             writer.close();
             return classes;
         }
        

        } ```

      5. 编译成class文件:

      6. 使用Java的编译器,如javac或 gradle compileJava,运行以下命令: bash javac -source-path /path/to/your/source/java-files --target-path /path/to/your/target/java-files Main.java
      7. 在运行的命令中, -source-path-target-path 参数指定源文件和目标文件的路径,即编译的目标文件路径。

      8. 编译Java代码到class文件,生成class文件的名称与源文件相同但扩展名为.class的文件。

      9. 在编译过程中,编译器可能会警告你缺少某些包或依赖项。例如,在上述例子中,Java编译器可能会提示你缺少java.utiljava.io包。

      10. 解决这个问题的方法是通过以下步骤:

        a. 添加所需的包和依赖项: - 在你的项目根目录下,添加以下依赖项: ```xml org.apache.commons commons-lang3 3.8.1 commons-io commons-io 2.11.0 org.apache.commons commons-collections4 4.11.0 org.apache.commons commons-beanutils 5.4.1 org.apache.commons commons-text 3.2.1 org.apache.commons commons-lang3-jdk8 3.8.1 org.apache.commons commons-lang3 3.7.0 org.apache.commons commons-collections4-jdk8 4.11.0 org.apache.commons commons-text-jsr310 1.1.1 org.apache.commons commons-lang3-compat 3.8.1 org.apache.commons commons-lang3-swing 3.8.1 org.apache.commons commons-lang3-beans 3.8.1 org.apache.commons commons-lang3-collections 3.8.1 org.apache.commons commons-beanutils-core 5.4.1 org.apache.commons commons-beanutils-extras 5.4.1 org.apache.commons commons-beanutils-jdk8 3.8.1 org.apache.commons commons-beanutils 5.4.1 jdk8 org.apache.commons commons-text-jsr310-api 1.1.1 org.apache.commons commons-lang3-compat 3.8.1 jdk8 org.apache.commons commons-lang3-swing 3.8.1 jdk8 org.apache.commons commons-lang3-beans 3.8.1 jdk8 org.apache.commons commons-lang3-collections 3.8.1 jdk8 org.apache.commons commons-beanutils-core 5.4.1 jdk8 javassist org.apache.commons commons-beanutils-exts 5.4.1 jdk8 org.apache.commons commons-beanutils-jdk8 3.8.1 jdk8 compiler-jdk8 org.apache.commons commons-lang3 <version

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部