web-dev-qa-db-ja.com

名前でクラスを取得する

アプリケーションにTestActivityというActivityクラスがある場合、この例のように名前でクラスを取得する方法はありますか。

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

代わりに forName を使用してください。

このようなもの..

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

Class.forName には例外があるようです。これは、この問題に対処するために上記を拡張するだけです。

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

Class::forName を使用して、不明なタイプのクラスオブジェクトを取得できます。型付きクラスを取得する場合は、Class::asSubclassによって返されるクラスで Class::forName を使用できます。

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

もちろん、さまざまな種類の例外を処理する必要もあります。リフレクションを扱うときはいつものように。

4
raphinesse

同様の要件もありました。画面とアクティビティのマッピングを含むバックエンドからのjsonがありました。 jsonはiOS/Androidの両方に共通しているため、Activityなどの用語をjsonに追加できませんでした。

  1. すべてのActivityまたはViewcontrollersのjsonでは、単純な名前を使用します。つまり、HomeActivityおよびHomeViewControllerにはjsonで「Home」を使用します

  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()
        }

これにより、同じメソッドで複数のクラスを簡単に管理できます。これは、すべてのセルが異なるアクティビティに移動するリサイクラビューで使用します。

1
anoop4real

それはあなたの質問に最も関連する答えではないかもしれませんが、クラス名リテラルを文字列としてハードコーディングすることは一般に悪いです。使用する方が良いかもしれません

Class<?> act = TestActivity.class;

構文。

0
Krivda