2012-05-09 2 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”; 

자바 클래스 파일을 파일 파일입니다

의 SQLStatement은 다음과 같습니다

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

의 열쇠는 일부 테이블에서 *를 선택

+1

열거 사용할 수 있습니다; 가능하지만 가장 간단한 접근법은 아닙니다. –

+0

@Dave, 이렇게 구현하려면 어떻게해야합니까? 제안/링크가 도움이 될 것입니다. – Raghu

+0

예. Dave가 말했듯이이 문제를 해결할 수는 있지만 그건 끔찍한 접근입니다. 대신'Map '또는 속성 파일 (어쨌든지도)을 사용하십시오. – 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 널 (null) : Constants.DEV_SELECT_STATEMENT //이 값 만

의 SQLStatement는 문자열을 제공하지 않습니다 문 String sqlStatement = QueryLoader.getStatement(queryKey);의 내부에서 결코 작동하지 않습니다. querykey의 문자열 값이 찾고자하는 절대 값이 아니라 전달됩니다.

할 수는 있지만 어렵습니다. 당신이해야 할 일은 toString 메서드를 재정의하고 querykey에서 toString이 호출 될 때 절대 값을 반환하는 방법을 찾아야합니다 !!

해결책 : 반사 사용!

+0

맞습니다.하지만 해결 방법이 있습니까? – Raghu

+0

예 .. 그냥 나가는 방법 !!나에게 약간의 시간이 해결책을 생각해 내게 할 것이다! –

0

때로는 해결책은 OP가 요구하는 질문에 대답하는 것이 아니라 문제를 해결하는 가장 간단한 해결책입니다.

네, 리플렉션을 사용할 수 있지만, 문제가 제대로 이해된다면 (문제는 상당히 혼란 스럽지만 ..) 해결하려는 기본적인 문제는 파일에서 <Key, Value> 쌍을 읽는 것입니다. 가장 간단한 해결 방법은 Map<String, String> 인 올바른 데이터 구조를 사용하는 것입니다. 당신이 파일의 데이터를 읽을 수 있기 때문에, 당신도 자신을이 구문을 분석 할 필요가 없습니다, 거기에 자바의 Properties

+0

글쎄, 나는 속성 파일이 있습니다. 그러나 키로 가려면 상수 파일에서 문자열을 읽어야합니다. 이것은 여러 환경에 공통적 인 쿼리가 많기 때문에 필요합니다. 상수 파일에는 값이 다른 환경에 대해 각 환경에 대한 문자열이 있습니다. 일단 값을 얻으면, 물론 해시 맵인 속성 파일을 읽습니다. – Raghu

+0

@Raghu 아니요, 그 이유는 아직 알지 못합니다. 키가'environment + real_key'라는 문자열 인 HashMap을 쉽게 사용할 수 있습니다. 그런 다음 특정 값에 매핑됩니다. equat/hashcode를 구현하는 커스텀 클래스를 사용하면 concat 문자열을 통과시키지 않고 동일한 원리로 개선 할 수 있습니다. – Voo

0

당신은 당신이 구축하고 런타임에 자바 코드를 평가하기 위해 노력하고 enum

관련 문제