アプリケーションにTestActivityというActivityクラスがある場合、次の例のように、そのクラスを名前で取得する方法はありますか?
Class<?> c = getClassByName("TestActivity");
回答:
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がありました。jsonはiOS / Androidの両方に共通しているため、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()
}
このようにして、同じメソッドで複数のクラスを簡単に管理できます。これは、すべてのセルが異なるアクティビティに移動するリサイクラービューで使用します。