アプリケーションに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がありました。 jsonはiOS/Androidの両方に共通しているため、Activity
などの用語をjsonに追加できませんでした。
すべてのActivity
またはViewcontrollers
のjsonでは、単純な名前を使用します。つまり、HomeActivity
およびHomeViewController
にはjsonで「Home」を使用します
アプリでは、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;
構文。