繁体   English   中英

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

[英]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.

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