2012-10-29 2 views
0

정적 변수에 액세스 할 수 있도록 클래스를 전달해야합니다. 예 :android - 클래스를 정적 ​​변수에 액세스하기위한 매개 변수로 전달

public static void process(Class anyClass){ 
    anyClass.x; 
} 
: 나는 (최우수상을하고 SecondClass 모두에 의해 사용되는) 다른 클래스의 메소드를 가지고 있지만, 그것은 정적 변수에 접근 할 필요가

Class FirstClass 
{ 
static int x = 1; 
} 
Class SecondClass 
{ 
static int x = 2; 
} 

, 여기에 논리와 의사의

답변

0

런타임에 액세스 할 클래스를 결정해야하고 비슷한 이름의 변수가있는 여러 클래스가있는 경우 Class.forName()을 사용하여 클래스 이름이 문자열 인 클래스의 인스턴스를 반환 할 수 있습니다.

http://developer.android.com/reference/java/lang/Class.html#forName(java.lang.String, boolean, java.lang.ClassLoader)

public static void process(String className){ 
    classInstance = Class.forName(className); 
} 

는 또한 (제대로 classInstance를 선언하거나 캐스트 할 수 있도록) 클래스 유형을 알고 있어야합니다. 가장 쉬운 방법은 모든 "anyClass"유형을 공통의 수퍼 클래스에서 상속받는 것입니다. 그런 다음

class AnyClassType1 extends AnyClass 
class AnyClassType2 extends AnyClass 

캐스트 또는 선언 classInstance : 반사를 통해 정적 필드

Field f = anyClass.getDeclaredField("x"); 
int xValue = f.getInt(null); 

액세스로 null을 전달하여 수 :

AnyClass classInstance; 
0

당신은 반사를 사용하여 클래스의 멤버에 액세스 할 수 있습니다 인스턴스 인수는 getInt()입니다.

비공개 입력란에 액세스하려고 했으므로 getDeclaredField을 사용하고 있습니다. 이 단점은 수퍼 클래스에 인 경우에도보고있는 클래스에 해당 필드가없는 경우 InvalidFieldException이 표시된다는 것입니다. 물론 수퍼 클래스에서 정의 되었더라도 공용 또는 보호 된 액세스가 있고 getField도 마찬가지로 작동합니다.

+0

이것은 좋은 친구처럼 보이지만 불행히도 정적 필드가 존재하지만 NoSuchFieldException을 던지고 있습니다. – lorraine

+0

그래, 미안해. 'getField'는 공개적으로 액세스 가능한 필드에서만 작동합니다. 필드를 공용으로 설정하거나 접근자가 같은 클래스에 있으면 보호를 설정하거나 대신에'getDeclaredField'를 사용해야합니다. – onon15