IT TIP

이름으로 수업 받기

itqueen 2020. 10. 23. 19:48
반응형

이름으로 수업 받기


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

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

사용 의 forName을 대신 ..

이 같은..

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

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

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

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

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

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


나는 또한 비슷한 요구 사항이 있었고 화면과 활동 매핑을 포함하는 백엔드에서 오는 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()
        }

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


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

Class<?> act = TestActivity.class;

통사론.

참고 URL : https://stackoverflow.com/questions/10119956/getting-class-by-its-name

반응형