Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编译后的1.6Java类中更改整数字段的最佳方法是无源代码_Java_Jvm_Bytecode_Decompiling_Bytecode Manipulation - Fatal编程技术网

在编译后的1.6Java类中更改整数字段的最佳方法是无源代码

在编译后的1.6Java类中更改整数字段的最佳方法是无源代码,java,jvm,bytecode,decompiling,bytecode-manipulation,Java,Jvm,Bytecode,Decompiling,Bytecode Manipulation,使用Java1.6设置编译的类文件有两个字段,我需要将它们设置为更高的值 private Integer days = 7; private Integer running = 30; 不幸的是,我再也无法访问正确版本的代码,只能访问类文件 以下是我已经尝试过的:我一直在玩弄BCEL、asm和javassist,但这似乎一点都不微不足道。我也找不到合适的字节码编辑器(jbe看起来非常混乱,类编辑器没有显示整数对象的值)。Eclipse字节码类文件查看器在尝试保存时会崩溃。使用十六进制编辑器来操

使用Java1.6设置编译的类文件有两个字段,我需要将它们设置为更高的值

private Integer days = 7;
private Integer running = 30;
不幸的是,我再也无法访问正确版本的代码,只能访问类文件

以下是我已经尝试过的:我一直在玩弄BCEL、asm和javassist,但这似乎一点都不微不足道。我也找不到合适的字节码编辑器(jbe看起来非常混乱,类编辑器没有显示整数对象的值)。Eclipse字节码类文件查看器在尝试保存时会崩溃。使用十六进制编辑器来操纵这些值是不可能的,因为它们将比现在有更多的数字。我还研究了javap,并用jasmin重新编译了它——这似乎是不可能的


因此,归根结底——拜托,噢,拜托——有没有人有一个好的例子,说明如何以任何可以想象的方式实现这一点?

我无法想象你为什么没有来源

我不会经历那么多痛苦。如果这很难,也许这是一个信号,你不应该这样做


我宁愿使用、反编译.class文件、进行更改,然后继续进行。

我无法想象为什么您没有源代码

我不会经历那么多痛苦。如果这很难,也许这是一个信号,你不应该这样做


我宁愿使用、反编译.class文件,进行更改,然后继续操作。

您尝试过反编译、编辑然后重新编译吗?据我所知,JD工作得很好


您是否尝试过反编译、编辑然后重新编译?据我所知,JD工作得很好

这看起来很有希望:

这看起来很有希望:


看一看。eclipse插件允许我窥视一些未记录的库,以帮助我更好地理解它。它并不适用于所有已编译的java类,但它几乎为我打开了迄今为止的一切。eclipse插件允许我窥视一些未记录的库,以帮助我更好地理解它。它并不适用于所有已编译的java类,但它几乎为我打开了迄今为止的所有内容。

您可以使用反射设置它们,就像前面的答案所指出的那样。以下是一个例子:

public class TestSetPrivateFields extends TestCase {

    public void testSetFields() throws Exception {
        Legacy legacyObj = new Legacy();
                    // get the fields using reflection
        Field[] fields = {
                          legacyObj.getClass().getDeclaredField("days"),
                          legacyObj.getClass().getDeclaredField("running")
                          }; 
        for (Field field : fields) {
            field.setAccessible(true);
            Integer value = (Integer) field.get(legacyObj);
            // set their value
            field.set(legacyObj, value+1);
        }

        Legacy expected = new Legacy();
        assertEquals(expected.getDays()+1, legacyObj.getDays()+0);
        assertEquals(expected.getRunning()+1, legacyObj.getRunning()+0);
    }

    public static class Legacy {
        private Integer days = 7;
        private Integer running = 30;

        public Integer getDays() {return days;}
        public Integer getRunning() { return running;}
    }

}

您可以像前面的答案所指出的那样,使用反射来设置它们。以下是一个例子:

public class TestSetPrivateFields extends TestCase {

    public void testSetFields() throws Exception {
        Legacy legacyObj = new Legacy();
                    // get the fields using reflection
        Field[] fields = {
                          legacyObj.getClass().getDeclaredField("days"),
                          legacyObj.getClass().getDeclaredField("running")
                          }; 
        for (Field field : fields) {
            field.setAccessible(true);
            Integer value = (Integer) field.get(legacyObj);
            // set their value
            field.set(legacyObj, value+1);
        }

        Legacy expected = new Legacy();
        assertEquals(expected.getDays()+1, legacyObj.getDays()+0);
        assertEquals(expected.getRunning()+1, legacyObj.getRunning()+0);
    }

    public static class Legacy {
        private Integer days = 7;
        private Integer running = 30;

        public Integer getDays() {return days;}
        public Integer getRunning() { return running;}
    }

}

就我个人而言,我希望我们(或Eclipse字节码大纲)生成java类,当与
java-cp asm-all.jar MyAsmClass
一起运行时,该类将生成所需类的新版本。有问题的值必须在所有构造函数中更新,并且将在
visitLdcInsn()
调用中。

我个人希望我们(或Eclipse字节码大纲)生成java类,当使用
java-cp asm-all.jar MyAsmClass
运行时,该类将生成所需类的新版本。有问题的值必须在所有构造函数中更新,并将在
visitLdcInsn()
调用中更新。

使用字节码编辑器非常简单。该字段将具有关联的DefaultValue属性,或者您将在()V中找到类似以下内容的内容:

aload_0
bipush 7
invokestatic java/lang/Integer#valueOf (I)Ljava/lang/Integer;
putfield Blah#days Ljava/lang/Integer;

这里应该很清楚要修复什么。

使用字节码编辑器非常简单。该字段将具有关联的DefaultValue属性,或者您将在()V中找到类似以下内容的内容:

aload_0
bipush 7
invokestatic java/lang/Integer#valueOf (I)Ljava/lang/Integer;
putfield Blah#days Ljava/lang/Integer;


这里应该很清楚要修复什么。

您是只有一个独立的类文件还是jar的一部分?在运行时使用反射设置它们是一个选项吗?它只是一个类文件。没有罐子。反射不是一种选择。它必须在类文件上完成。您是否只有一个独立的类文件,或者它是jar的一部分?是否在运行时使用反射选项设置它们?它只是一个类文件。没有罐子。反射不是一种选择。它必须在类文件上完成。是的,这也是我推荐的。我在eclipse中使用它,它工作得很好。使用常规反编译器意味着,我也必须访问所有依赖项,才能重新编译它。很遗憾我没有。是的,这也是我推荐的。我在eclipse中使用它,它工作得很好。使用常规反编译器意味着,我也必须访问所有依赖项,才能重新编译它。遗憾的是,我没有。+1-谢谢,没有时间提前发布示例。同样为了你答案的完整性。因为那必须在运行时完成,所以我不能使用它。谢谢你的努力。+1-谢谢,没有时间提前发布一个例子。同样为了你答案的完整性。因为那必须在运行时完成,所以我不能使用它。不过,感谢您的努力。正如我所说,类编辑器当前不允许我更改整数对象的值-或者太令人困惑。正如我所说,类编辑器当前不允许我更改整数对象的值-或者太令人困惑。有趣的解决方案。操作字节码似乎很简单。但是上面的命令行不会将asm文件重新编译回类文件——asm能够做到吗?您只需使用javac编译它并运行生成的类。它将生成有问题的类。有趣的解决方案。操作字节码似乎很简单。但是上面的命令行不会将asm文件重新编译回类文件——asm能够做到吗?您只需使用javac编译它并运行生成的类。它将生成有问题的类。代码的旧版本未进行版本控制。老程序员都走了。再也没有机会回去了,很简单。代码的旧版本未进行版本控制。老程序员都走了。没有机会再回去了。谢谢,但是查看源代码不是问题。它能够操作类文件。反编译后,JD Core无法在没有所有依赖项的情况下重新编译。谢谢,但查看源代码不是问题。它能够操作类文件。及