[英]Reflection: how to call superclass constructor which is hidden?
重新编辑...
我想使用由“@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 编程方面不是很有经验。
经过一些研究,我能够自己回答这个问题。
简短回答:我不能这样做,因为如果超类构造函数受到保护和隐藏,即使我找到了一种如何通过反射调用构造函数的方法,编译器也会抱怨。
长答案:事实证明,“取消隐藏”这些东西并没有那么复杂。 按照本教程,我可以根据自己的需要扩展课程。
看? 一大堆无用的噪音,这就是我一直在寻找的答案。
您想找到该构造函数并将其可用性设置为 true。
但这是一项危险的操作,您不应轻易尝试。 私人不一定意味着私人是一个肮脏的秘密,但我仍然希望你尊重班级设计师的意愿而不是规避。
此外,你不需要。 如果我理解您的要求,我已经发布了一个可以满足您要求的示例。
这是有效的,因为:
protected 修饰符指定该成员只能在它自己的包中访问(如包私有),此外,它的类的子类在另一个包中可以访问。
我认为您混淆了受保护修饰符的含义。
带有受保护 ctor 的父级:
package foo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Parent with protected constructor
* User: MDUFFY
* Date: 3/27/14
* Time: 5:18 PM
* @link http://stackoverflow.com/questions/22698501/reflection-how-to-call-superclass-constructor-which-is-hidden/22698543?noredirect=1#comment34586243_22698543
*/
public class Foo {
private List<String> x;
protected Foo(List<String> y) {
this.x = ((y == null) ? new ArrayList<String>() : new ArrayList<String>(y));
}
public List<String> getX() {
return Collections.unmodifiableList(this.x);
}
@Override
public String toString() {
return "Foo{" +
"x=" + x +
'}';
}
}
子扩展父:
package bar;
import foo.Foo;
import java.util.Arrays;
import java.util.List;
/**
* Child of parent with protected ctor
* User: MDUFFY
* Date: 3/27/14
* Time: 5:22 PM
* @link http://stackoverflow.com/questions/22698501/reflection-how-to-call-superclass-constructor-which-is-hidden/22698543?noredirect=1#comment34586243_22698543
*/
public class Bar extends Foo {
public static void main(String[] args) {
Bar bar = new Bar(Arrays.asList(args));
System.out.println(bar);
}
public Bar(List<String> y) {
super(y);
}
}
这将编译并运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.