0

次のコードがあり、newInstnace() を呼び出すと Instantiation 例外が発生します

助けてください

  Class cls = Class.forName("com.android.internal.os.BatteryStatsImpl$Uid");
Object obj = cls.newInstance();
4

1 に答える 1

0

内部クラスが宣言されていない限り、staticそれが属する外部クラスのインスタンスなしで内部クラスのインスタンスを作成することはできません。それらのいずれかを取得したら、リフレクションを使用して内部クラスのコンストラクターを取得する必要があります。のドキュメントからこれに注意してくださいClass.getConstructor

このClassオブジェクトが非静的コンテキストで宣言された内部クラスを表す場合、仮パラメーターの型には、最初のパラメーターとして明示的な囲みインスタンスが含まれます。

最後に、コンストラクターのメソッドを呼び出してnewInstance、外側のクラスのインスタンスを最初の引数として渡す必要があります。

囲んでいるクラスのインスタンスでは、実際にはリフレクションは必要ありません。

BatteryStatsImpl stats = . . .;
com.android.internal.os.BatteryStatsImpl.Uid obj = stats.new Uid();

EDITリクエストごとに、サンプルコードを次に示します(エラーチェックなし):

Class<?> statsClass = Class.forName("com.android.internal.os.BatteryStatsImpl");
Object statsObject = statsClass.newInstance();
Class<?> uidClass = Class.forName("com.android.internal.os.BatteryStatsImpl$Uid");
Constructor<?> ctor = uidClass.getConstructor(statsClass);
Object uidObject = ctor.newInstance(statsObject);

もちろん、これはすべて Android 内部の一部であり (公開された API の一部ではありません)、標準の「自己責任で使用してください」という警告が表示されることに注意してください。 ) Android の将来のバージョンでは予告なしに。

于 2013-08-25T08:07:25.280 に答える