2011-12-27 4 views
3

내가하는 KeyEvent를 확장하는 클래스를 생성 :이름으로 "public static final int"값을 얻는 방법?

public class myKeyEvent extends KeyEvent { 
    public static final int MY_KEYCODE_01 = KeyEvent.KEYCODE_A; 
    //... 
    public static final int MY_KEYCODE_30 = KeyEvent.KEYCODE_Z; 
} 

지금, 나는 다른 클래스에서 (. 예를 들어 "MY_KEYCODE_01"정수 값 KeyEvent.KeyCODE_A을 반환해야합니다) 변수 이름으로 정수 값을 얻으려면 (다른 파일). 로그 캣에서

try{ 
    Class cls = myKeyEvent.class.getClass(); 
    Field field = cls.getDeclaredField("MY_KEYCODE_01"); 
    int value = (Integer) field.get(cls); 
    Log.v("TAG", "Field value is " + value); 

} catch (NoSuchFieldException e) { 
    Log.e("TAG", "Field either doesn't exist or is not public: " + e.toString()); 
} 

:

나는에 노력

Field either doesn't exist or is not public: java.lang.NoSuchFieldException: MY_KEYCODE_01 

내가 어떻게 할 수 있습니까?

+0

'myKeyEvent' 클래스가'public'이면'MY_KEYCODE_01' 필드가'public'이기 때문에'Field field = KeyEvent.MY_KEYCODE_01; '입니다. – Bhushan

+1

그런 식으로 이름을 바꿉니다. 혼란스러워 할 것입니다. 그 숫자는 개발자에게 특히 도움이되지 않습니다 (특히 몇 개 건너 뛰었 기 때문에). 또한 정적 필드는 상속되므로 'myKeyEvent.KEYCODE_A'로 액세스 할 수 있어야합니다 (이 클래스의 이름을 좀 더 잘 지정하십시오). 정확히 무엇을 성취하려고합니까? (반사가 아닌, 약간의 무의미 함, 어떤 수업이 사용 되었기 때문에 ...)? –

답변

5

myKeyEvent.class.getClass()을 수행하면 클래스는 myKeyEvent.class이고 클래스 개체의 클래스는 Class입니다.

디버거에서 클래스가 올바르지 않다는 것을 알 수 있어야합니다.

int value=0; 
    try { 
     Class aClass = MyKeyEvent.class; 

     Field f = aClass.getDeclaredField("MY_KEYCODE_01"); 
     Log.d(TAG, f.toString()); 
     value = f.getInt(null); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Log.d(TAG, "value = " + value); 

나는 또한 설명을 추가로 결정했습니다 :

+0

이 수정은 있었지만 여전히 같은 오류가 발생했습니다 :'필드가 존재하지 않거나 public이 아닙니다 : java.lang.NoSuchFieldException : MY_KEYCODE_01' – Jorge

+0

'System.out.println (Arrays.toString (myKeyEvent.class. getDeclaredFields()))); –

0

여기에 가능한 코드입니다. Class aClass = MyKeyEvent.class; 줄에서 MyKeyEvent 클래스를 나타내는 Class 인스턴스를 만듭니다. 그 후 우리는 지정된 이름으로 선언 된 필드를 얻습니다. 가장 어려운 부분은 value = f.getInt(null);입니다. 여기서 우리는 f 필드의 값을 얻습니다. 그러나 일반적인 경우이 값은 MyKeyEvent 클래스의 모든 객체마다 다릅니다. 따라서 MY_KEYCODE_01이 static final로 선언되면 모든 객체에 대해 동일한 값을가집니다. 따라서 getInt 함수의 매개 변수로 null을 사용합니다.

0

정확히 무엇이 필요합니까? Java에서 리플렉션을 사용하여이 작업을 수행 할 수는 있지만 실제로 원하지는 않는다고 확신합니다. 이름으로 문자열로 변수에 액세스하는 것은 변수의 값을 가져 오는 일반적인 방법이 아니며 이후 개발에 많은 문제를 야기 할 수 있습니다.

사전이나 열거 형을 대신 사용해보십시오.

0

가변 가능 MY_KEYCODE_01MY_KEYCODE_30은 정적으로 선언됩니다. 따라서 getClass을 사용할 필요가 없습니다. myKeyEvent.MY_KEYCODE_01 또는 myKeyEvent.MY_KEYCODE_30을 사용하고 Logcat에서 인쇄하십시오. 이 같은 몇 가지 :

Log.i("TAG", "Field value is " + myKeyEvent.MY_KEYCODE_01); 

희망 원하는 값을 얻을 수 있습니다.

관련 문제