重新编辑...
我想使用一个超级构造函数,它被“@hide”Android标记(或其他任何东西)隐藏。
我即将扩展已经扩展两次的类(在Android OS中)。我想创建自己的子类(即在Android OS之外)。示例子类,取自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示例。我不能只继承&amp;调用super()因为超类构造函数被Android的“@hide”标记,因此无法在没有反映非系统程序员的情况下使用。
所以我的问题是如果我不能通过普通的super()调用来访问/调用超类构造函数?反思应该派上用场,但我对Java编程不是很有经验。
答案 0 :(得分:2)
经过一些研究,我能够自己回答这个问题。
简短回答:我不能这样做,因为如果超类构造函数受到和隐藏,即使我找到了一种如何通过反射调用构造函数的方法,编译器也会抱怨
答案很长:事实证明它并没有那么复杂,以及#34;取消隐藏&#34;这个东西。关注this tutorial我能够将课程扩展到我的需要。
请参阅?没什么噪音,这就是我要找的答案。
答案 1 :(得分:0)
您想要找到该构造函数并将其可用性设置为true。
但这是一个危险的操作,你不应该轻易尝试。这是一个肮脏的秘密,私人不需要私密,但我仍然希望你尊重班级设计师的意愿,而不是规避。
此外,你不需要。如果我了解您的要求,我已经发布了一个可以满足您需求的示例。
这是有效的,因为:
protected修饰符指定只能访问该成员 在它自己的包中(与package-private一样),另外,通过 另一个包中其类的子类。
我认为您已经混淆了受保护修饰符的含义。
父母带保护的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 +
'}';
}
}
Child扩展Parent:
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);
}
}
这将编译并运行。