2012-05-09 12 views
1

私は定数ファイルからキー値のペアを読み込もうとしています。クラス名とフィールド名を直接使用すると動作しますが、クラス+フィールドの組み合わせを動的に構築すると機能しません。この問題の交渉方法DEV_INT_SQL_SELECT_STATEMENTJava定数文字列を構築してインスタンス化する

次は、これはキーがある

public someClass 
{ 
public someMethod() //This works 
    { 
     String sqlStatement = QueryLoader.getStatement(Constants.DEV_SELECT_STATEMENT); 
     System.out.println("The key is :" + Constants. DEV_SELECT_STATEMENT); 
     System.out.println(“SqlStatement is : “ + sqlStatement); 
     } 
} 

に動作します//私の定数は

Public interface Constants 
{ 
String DEV_SELECT_STATEMENT = “DEV_INT_SQL_SELECT_STATEMENT” 
String INT_SELECT_STATEMENT = “DEV_INT_SQL_SELECT_STATEMENT” 
} 

Query.propertiesが

DEV_INT_SQL_SELECT_STATEMENT = “SELECT * FROM SOME TABLE”; 

Javaクラスファイルをファイルファイルであります

のSQLStatementは次のとおりです。Constants.DEV_SELECT_STATEMENTは//これは、値を与えるものではありませんが、文字列

のSQLStatementは、次のとおりです:ヌル

+1

列挙使用する場合があります。最も簡単なアプローチではありません。 –

+0

@Dave、これを実装するにはどうすればよいですか。提案/リンクが役立つ – Raghu

+0

はい、これはDaveの言うとおり回避できますが、それは恐ろしいアプローチです。代わりに 'Map 'を使うか、あるいは(map any any)プロパティファイルを使ってください。 – Voo

答えて

1

使用リフレクション:

String fieldName = env+"_SELECT_STATEMENT"; 

String value = String.valueOf(Constants.class.getField(fieldName).get(null)); 

編集:私は、私はいくつかの違法な事を行っていた通知は、私が編集したコードとそれをテストしているか

どれ(Constants.class.getClass()が有効ではありません)作品。

+0

絶対に正しい...反射は目的を十分に満たします! –

+0

このコードは私にオブジェクトを与えます。私はそのオブジェクトのtoStringを行い、使用しようとしますが、これは何らかの理由でNoSuchFieldExceptionを与えています。フィールドは確かにそこにあります。 – Raghu

+0

@maress perfect ...これが動作します。ありがとう – Raghu

0

yes..itキーがある

public someClass //This does not work 
{ 
public someMethod(String env) //This does not work 
    { 
     String queryKey = “Constants” +env + “_SELECT_STATEMENT “; 
     System.out.println(“The Key is : “ + queryKey); 
     String sqlStatement = QueryLoader.getStatement(queryKey); 
     System.out.println(“SqlStatement is : “ + sqlStatement); 
    } 

SOME TABLE SELECT * FROMステートメントString sqlStatement = QueryLoader.getStatement(queryKey);の中では決して動作しません。あなたが探している絶対値ではなく、querykeyの文字列値が渡されます。

しているのですができません。 あなたがする必要があるのは、toStringメソッドをオーバーライドして、querykeyのtoStringが呼び出されるときに絶対値を返す方法を見つけることです!!

解決策: 反射を使用してください!

+0

それは正しいですが、そこには回避策がありますか? – Raghu

+0

はい。ちょうど方法を働かせて!私にいくつかの時間を与えて解決策を思いついてください! –

0

解決策は、OPが求めている質問に答えるのではなく、代わりに問題を解決するための最も簡単な解決策です。

はい、あなたはReflectionを使うことができますが、私が問題を正しく理解していれば(質問はかなり混乱しますが)、解決したい基本的な問題は<Key, Value>のペアをファイルから読み込むことです。最も簡単な解決策は、これに適切なデータ構造を使用することです。これはMap<String, String>です。あなたは、ファイルからデータを読み込みたいので、あなたも自分でこれを解析する必要はありません、がありますJavaのProperties

+0

まあ、私はプロパティファイルを持っています。しかし、キーに到達するには、定数ファイルから文字列を読み込む必要があります。これは、複数の環境に共通のクエリが多数存在するために必要です。定数ファイルでは、環境ごとに値が異なる環境ごとに文字列があります。値を取得すると、私はもちろん、ハッシュマップであるプロパティファイルを読みます。 – Raghu

+0

@Raghuいいえ、私はまだその理由を見ません。 'environment + real_key'という文字列のキーを持つHas​​hMapを簡単に使用して、特定の値にマッピングできます。あなたはconcat文字列を渡すのではなく、同じ原則を渡すように、equals/hashcodeを実装するカスタムクラスを使ってそれを改善することができます。 – Voo

0

あなたが構築し、実行時にJavaコードを評価しようとしているenum

関連する問題