내 응용 프로그램에 TestActivity라는 Activity 클래스가있는 경우이 예제와 같이 이름으로 클래스를 가져올 수있는 방법이 있습니까?
Class<?> c = getClassByName("TestActivity");
답변:
사용 의 forName을 대신 ..
이 같은..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
있습니까?
Class::forName
알 수없는 유형의 클래스 객체를 가져 오는 데 사용할 수 있습니다 . 형식화 된 클래스를 얻으려면에서 Class::asSubclass
반환 된 클래스에서 사용할 수 있습니다 Class::forName
.
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
물론 다양한 유형의 예외도 처리해야합니다. 반사를 다룰 때 평소처럼.
Class.forName을이 거기에 예외를 갖고있는 것 같아요. 이것은이 문제를 해결하기 위해 위의 내용을 확장하는 것입니다.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
나는 또한 비슷한 요구 사항이 있었고 화면과 활동 매핑을 포함하는 백엔드에서 오는 json이있었습니다. iOS / 안드로이드 모두에 공통된 json이기 때문에 json에 같은 용어를 추가 Activity
할 수 없었으므로 이것이 우리가 한 일입니다.
모든 JSON에서 Activity
또는 Viewcontrollers
사용의 간단한 이름은 용 IE HomeActivity
와 HomeViewController
우리는 JSON에서 "홈"을 사용합니다
앱에서 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()
}
이렇게하면 동일한 방법으로 여러 클래스를 쉽게 관리 할 수 있습니다. 내 모든 셀이 다른 활동으로 이동하는 리사이클 러 뷰에서 이것을 사용합니다.