1

マップテーブルがあります

public static final String key1 = "newKey";
public static final String key2 = "key2";
public static final String key3 = "key3";
public static final String key4 = "key4";

public static Map<String, String> objects = new TreeMap<String, String>();

TreeMap.put(key1,"Bob1")
TreeMap.put(key2,"Bob2")
TreeMap.put(key3,"Bob3")
TreeMap.put(key4,"Bob4")

最初のパラメーターはキーです。キーが存在するかどうかを確認したい。だから私はこのコードを書きました

public String checkKey(String keyToCheck) {

    if (objects.containsKey(keyToCheck)) {
     .......
    }
}

問題は、ユーザーがcheckKey次の2つの方法で電話をかけることができることです。

  1. checkKey( "newkey")

  2. checkKey( "className.key1")

これらの文字列のいずれかは、ユーザー入力から取得されます。前者の場合、地図上にあるので問題ありません。しかし、2番目のケースでは、対応する値を取得できるように変換する必要がありnewkeyます。

4

4 に答える 4

3

あなたがこれを持っていると仮定します:

public class MyClass {
  public static final String key1 = "newKey";
}

次のようにチェックする必要があります。

checkKey(MyClass.key1);

いいえ

checkKey("MyClass.key1");

編集:どうやら、私の答えは間違っています。明確にするために彼の質問を編集しました。

于 2013-01-08T05:57:05.443 に答える
1

リフレクションを使用してみることができます。ただし、入力としてクラスの完全修飾名を指定する必要があります。そうしないと、クラスが見つからないという例外が発生します。

あなたの場合、定数ファイルの完全修飾名が必要です。

以下のサンプルは、デフォルトのパッケージから実行されます。

import java.lang.reflect.Field;

    public class TestReflection {

        public static final String key1 = "newKey";

        public static void main(String[] args) throws SecurityException,
                NoSuchFieldException, IllegalArgumentException,
                IllegalAccessException, ClassNotFoundException {
            checkKey("newKey");
            checkKey("TestReflection.key1");
        }

        private static void checkKey(String str) throws NoSuchFieldException,
                IllegalAccessException, ClassNotFoundException {
            String[] str1 = str.split("\\.");
            if (str1.length == 1) {
                System.out.println(str1[0]);
            } else if (str1.length == 2) {
                Field value = Class.forName(str1[0]).getField(str1[1]);
                value.setAccessible(true);
                System.out.println(value.get(null));
            }
        }
    }
于 2013-01-08T06:32:23.070 に答える
0

これには、別のオーバーロードされたメソッドを使用できます。

checkKey(Class<?> clazz, String keyToCheck){

   //use reflection to check that key
}

これが役立つことを願っています。

このユーザーを実行すると、キーが属するクラスをキー名ではなく別の引数として渡す必要があるという明確なアイデアが得られます。

それ以外の場合は、他の回答が正しく指摘しているようにしてください。

于 2013-01-08T06:01:37.213 に答える
0

変数参照を渡すために引用符を使用しないでください。checkKey(className.key1) を使用します。言及された問題では、リフレクションを使用する必要はありません。

Class.forName("解析後のクラス名").getField("解析後のフィールド"); を使用します。

于 2013-01-08T06:00:43.183 に答える