【发布时间】:2014-05-07 01:39:23
【问题描述】:
重新编辑...
我想使用一个被“@hide”Android 标签(或其他标签)隐藏的超类构造函数。
我即将扩展一个已经扩展了两次的类(在 Android 操作系统中)。我想创建自己的子类(即在 Android 操作系统之外)。示例子类,取自 Android 资源:
public class WifiP2pDnsSdServiceInfo extends WifiP2pServiceInfo {
...
private WifiP2pDnsSdServiceInfo(List<String> queryList) {
super(queryList); // <-- this is what I'm trying to do, too
}
public static WifiP2pDnsSdServiceInfo newInstance(String instanceName,
String serviceType, Map<String, String> txtMap) {
...
ArrayList<String> queries = new ArrayList<String>();
...
return new WifiP2pDnsSdServiceInfo(queries);
}
}
超类如下所示:
public class WifiP2pServiceInfo implements Parcelable {
...
// this is marked as @hidden therefore inaccessible!
protected WifiP2pServiceInfo(List<String> queryList) {
if (queryList == null) {
throw new IllegalArgumentException("query list cannot be null");
}
mQueryList = queryList;
}
}
而我要做的就是制作另一种 WifiP2pServiceInfo,类似于上面的 WifiP2pDnsSdServiceInfo 示例。我不能只继承和调用 super(),因为超类构造函数被 Android 的“@hide”标记,因此对于非系统程序员来说,如果没有反射就无法使用。
所以我的问题是如果我不能通过普通的 super() 调用来访问/调用超类构造函数?反射在这里应该派上用场,但我在 Java 编程方面不是很有经验。
【问题讨论】:
-
如果A类的编写者将构造函数标记为私有,则表示该类不是为扩展而设计的
-
在这种情况下,您已经调用了 super()。未定义在同一个对象上调用两个构造函数的结果。
-
可以在同一个包中定义类。它不必在同一个地方。我假设隐藏意味着它具有
default访问修饰符。 -
超类构造函数是否标记为
protected?private?或者什么都没有(这会使它成为包私有的)? -
@EJP:我很确定在这种情况下子类不会调用 super()。
标签: java android reflection superclass