反思:如何调用隐藏的超类构造函数?

时间:2014-03-27 20:27:27

标签: java android reflection superclass

重新编辑...

我想使用一个超级构造函数,它被“@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编程不是很有经验。

2 个答案:

答案 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);
    }


}

这将编译并运行。