이름으로 수업 받기


81

내 응용 프로그램에 TestActivity라는 Activity 클래스가있는 경우이 예제와 같이 이름으로 클래스를 가져올 수있는 방법이 있습니까?

Class<?> c = getClassByName("TestActivity");

답변:


158

사용 의 forName을 대신 ..

이 같은..

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}

30
전체 패키지 이름도 제공해야합니다. 예 : com.bla.TestActivity를 Class.forName에 대한 인수로 사용
Richie

1
당신은 또한받을 일을 할 수 Class<? extends SomeClass>있습니까?
Gobliins

@Gobliins 아니요-컴파일러는 얻을 클래스의 종류를 보장 할 수 없으므로 Class <?>를 제공합니다. 어떤 종류의 클래스를 받을지 알고 있다면 캐스팅해야합니다 (그래도 캐스트가 안전하지 않기 때문에 확인되지 않은 캐스트 경고가 표시됩니다).
Dylanthepiguy jul.

@Gobliins 특정 유형의 하위 클래스를 얻는 방법에 대한 내 답변 을 확인하십시오 .
raphinesse

6

Class::forName알 수없는 유형의 클래스 객체를 가져 오는 데 사용할 수 있습니다 . 형식화 된 클래스를 얻으려면에서 Class::asSubclass반환 된 클래스에서 사용할 수 있습니다 Class::forName.

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
                                               .asSubclass(Activity.class);

물론 다양한 유형의 예외도 처리해야합니다. 반사를 다룰 때 평소처럼.


6

Class.forName을이 거기에 예외를 갖고있는 것 같아요. 이것은이 문제를 해결하기 위해 위의 내용을 확장하는 것입니다.

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}

이렇게 대답하는 일반적인 방법은 대답을 편집 하는 것입니다. Java에는 예외가 많기 때문에 (그리고 코드가이를 무시하기 때문에) 주석 으로 해결하기에 충분합니다.
tsn

7
@crazyhatfish-패트릭이 자신의 답변을 게시하는 것 외에는 도움이되는 일을 할 수있는 권한이 없었던 것 같습니다 .
amess

3
@amess 죄송합니다, 귀하의 권리, 댓글이 담당자가 필요하다는 사실을 잊어 버렸습니다. 수정 해주셔서 감사합니다.
tsn

2

나는 또한 비슷한 요구 사항이 있었고 화면과 활동 매핑을 포함하는 백엔드에서 오는 json이있었습니다. iOS / 안드로이드 모두에 공통된 json이기 때문에 json에 같은 용어를 추가 Activity할 수 없었으므로 이것이 우리가 한 일입니다.

  1. 모든 JSON에서 Activity또는 Viewcontrollers사용의 간단한 이름은 용 IE HomeActivityHomeViewController우리는 JSON에서 "홈"을 사용합니다

  2. 앱에서 json을 구문 분석하고 활동을 동적으로 가져 오기 위해 아래 유틸리티 메서드를 작성했습니다.

수업 이름을 얻으려면 (예 : Home을 통과하면 다시 돌아옵니다 com.package.HomeActivity)

    fun getClassInfoFor(name: String, context: Context):String{
        var str = "${context.getPackageName()}.${name}Activity"
        return str
    }

이제 문자열에서 클래스를 얻으려면

        try {
            val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
            val fetchedClass = Class.forName(className)
            val showDetailsIntent = Intent(context, fetchedClass)
            context.startActivity(showDetailsIntent)
        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        }

이렇게하면 동일한 방법으로 여러 클래스를 쉽게 관리 할 수 ​​있습니다. 내 모든 셀이 다른 활동으로 이동하는 리사이클 러 뷰에서 이것을 사용합니다.


귀하의 답변은 Kotlin에 있습니다.) 아마도 Java로 만들기 위해 약간 변경 하시겠습니까?
LMD

@LMD 아마 대부분의 응답 필요의 코 틀린 버전에 대한 검색 안드로이드 개발자가 아닌 자바)
루슬란 Berozov

@RuslanBerozov op는 질문에 [java]로 태그를 지정 했으므로 적어도 Java 버전을 기대할 것입니다 (물론 추가 Kotlin도 괜찮습니다).
LMD

@LMD는 미안하지만 op는 2012 년에 질문을 올렸습니다. 그가 당시 Kotlin에 대해 알고 있었다고 상상하기 정말 어렵습니다. 요점은 질문도 [android]로 표시되어 있으며 요즘에는 Kotlin 버전이 바람직하다는 것입니다.
Ruslan Berozov

-2

귀하의 질문에 가장 적합한 답변은 아닐 수 있지만 일반적으로 클래스 이름 리터럴을 문자열로 하드 코딩하는 것은 좋지 않습니다. 사용하는 것이 더 나을 수 있습니다

Class<?> act = TestActivity.class;

통사론.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.