繁体   English   中英

使用反射android java获取InstantiationException的内部类的调用方法

[英]Calling method of innerclass using reflection android java getting InstantiationException

我有以下代码,并且在调用newInstnace()时遇到了Instantiation异常

你能帮忙吗

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

除非将内部类声明为static ,否则,如果没有外部类的实例,则无法创建内部类的实例。 一旦有了其中之一,就需要使用反射来获取内部类的构造函数。 Class.getConstructor的文档中注意这一点:

如果此Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式的封闭实例作为第一个参数。

最后,您需要调用构造函数的newInstance方法,并将外部类的实例作为第一个参数传递给它。

使用封闭类的实例,您实际上不需要反射:

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

编辑每个请求,这是一些示例代码(不检查错误):

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版本中进行通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM