0

Javaコードをデバッグするとき、アプリケーションでそれらを取得して何かを行うのに役立つオブジェクトの多くのプロパティをよく見かけますが、APIまたはjavadocを見て、クラスにはそのようなプロパティまたはゲッターがありませんこれらのプロパティ値を取得するメソッド。例えば:

myPhoneCallObj.foo  has value "bar" in debugger
myPhoneCallObj.baz has value otherObj which in turn has other values like otherObj.baz

Javaではできません:

String myValue = myPhoneCallObj.foo

Javaではコンパイルされませんが、Groovyでは上記のコードを記述でき、実行時に必要な値を取得できます。同じことを Java コードでどのように行うことができますか?

myPhoneCallObj は Java インターフェイス PhoneCall のインスタンスであり、デバッガーはこれをタイプ PhoneCallImpl (インターフェイスのサードパーティ実装) として表示していました。私はそのサードパーティのソースコードにアクセスして理解することはできませんが、インターフェイスには API の完全なドキュメントと Javadoc があります。

4

3 に答える 3

1

次のようなクラスが与えられます:

class X
{
    private int value;

    @Override
    public String toString()
    {
        return (Integer.toString(value));
    }
}

あなたはこれを行うことができます:

import java.lang.reflect.Field;


public class Test 
{
    public static void main(final String[] argv) 
        throws NoSuchFieldException, 
               IllegalArgumentException,
               IllegalAccessException
    {
        final X x;

        x = new X();
        System.out.println(x);
        changeValue(x);
        System.out.println(x);
    }

    private static void changeValue(final X x) 
        throws NoSuchFieldException, 
               IllegalArgumentException,
               IllegalAccessException
    {
        final Class<X> clazz;
        final Field    field;

        clazz = X.class;
        field = clazz.getDeclaredField("value");
        field.setAccessible(true);
        field.set(x, Integer.MAX_VALUE);
    }
}

ここで重要なのは、プライベートであってもアクセスを許可するfield.setAccessible(true);という呼び出しです。value

ただし、通常、フィールドがプライベートである理由があり、操作しているサードパーティコードの新しいリリースでコードが壊れても驚かないでください。

于 2013-03-03T05:56:28.973 に答える
0

これらのプロパティはプライベートですか、それともスコープ内で保護されていますか?直接アクセスできるプロパティはパブリックプロパティのみですが、すべての変数はデバッグオブジェクトインスペクターに表示されます。

于 2013-03-03T03:56:19.413 に答える
0

絶対に値を取得する必要がある場合は、リフレクションを使用できます。(おそらくGroovyが行っていることです)

于 2013-03-03T05:47:40.037 に答える