1

java 1.6設定でコンパイルされたクラスファイルには、より高い値に設定する必要がある2つのフィールドがあります。

private Integer days = 7;
private Integer running = 30;

残念ながら、私はもう正しいリビジョンのコードにアクセスできず、クラスファイルを提示するだけです。

これが私がすでに試したことです:私はBCEL、asm、javassistをいじくり回してきましたが、これは決して些細なことではないようです。適切なバイトコードエディタも見つかりませんでした(jbeは本当に混乱しているように見えますが、クラスエディタはIntegerオブジェクトの値を表示しません)。Eclipseバイトコードクラスのファイルビューアは、保存しようとするとひび割れます。16進エディタを使用して値を操作することは、現在よりも多くの桁を持つため、問題外です。また、javapを調べて、jasminで再コンパイルしました。これは不可能のようです。

それで、最終的に-お願いします、ああお願いします-誰かがこれが想像できる方法でどのように行われることができるか良い例を持っていますか?

4

7 に答える 7

2

逆コンパイル、編集、再コンパイルを試しましたか? 私の知る限り、JDはかなりうまくいっています。

http://java.decompiler.free.fr/

于 2011-05-05T23:36:11.583 に答える
2

以前の回答が指摘したように、リフレクションを使用してそれらを設定できます。次に例を示します。

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;}
    }

}
于 2011-05-06T00:03:57.617 に答える
0

なぜソースがないのか想像がつきません。

私はそのすべての痛みを経験することはありません。それが難しい場合は、それをやるべきではないというサインかもしれません。

私はむしろJADを使用し、 .class ファイルを逆コンパイルし、変更を加えて、それを続けたいと思います。

于 2011-05-05T23:34:31.197 に答える
0

これは有望に見えます:

http://classeditor.sourceforge.net/

于 2011-05-05T23:39:17.377 に答える
0

JD-Coreを見てください。Eclipse のプラグインを使用すると、文書化されていないライブラリを覗いて理解を深めることができました。コンパイルされたすべてのJavaクラスで機能するわけではありませんが、これまでのところほとんどすべてが開かれました.

于 2011-05-05T23:40:22.157 に答える
0

バイトコード エディタの使用は非常に簡単です。フィールドに DefaultValue 属性が関連付けられているか、()V に次のようなものがあります。

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

ここで何を修正すべきかは明らかです。

于 2011-07-19T16:21:56.740 に答える
0

個人的には、 ASMifierjava -cp asm-all.jar MyAsmClass (または Eclipse Bytecode Outline) を使用して、実行時に必要なクラスの新しいバージョンを生成する Java クラスを生成します。問題の値はすべてのコンストラクターで更新する必要があり、visitLdcInsn()呼び出しになります。

于 2011-05-06T08:11:48.677 に答える