Java 如何使用反射来获得一个构造函数,其中您将作为参数传递一个超类

Java 如何使用反射来获得一个构造函数,其中您将作为参数传递一个超类,java,reflection,constructor,parameter-passing,extends,Java,Reflection,Constructor,Parameter Passing,Extends,今天在编写代码时,我开始深入思考世界。我以前把它搞得一团糟,但从来没有到过这种程度,无论我往哪里看,我都找不到我问题的答案,所以我就在这里!目前,我正在尝试对构造函数请求参数的类使用反射,但为了便于使用,我希望使用参数的超类 下面是一些解释中导致问题的代码: this.listener = (MyListener) listenerClass.getConstructor(MyAppState.class).newInstance(this); 问题是MyAppState是我的所有AppSta

今天在编写代码时,我开始深入思考世界。我以前把它搞得一团糟,但从来没有到过这种程度,无论我往哪里看,我都找不到我问题的答案,所以我就在这里!目前,我正在尝试对构造函数请求参数的类使用反射,但为了便于使用,我希望使用参数的超类

下面是一些解释中导致问题的代码:

this.listener = (MyListener) listenerClass.getConstructor(MyAppState.class).newInstance(this);
问题是MyAppState是我的所有AppState都从中扩展而来的类,每个侦听器都接受自己的特定AppState,它扩展了MyAppState,但具有彼此不同的额外特性。我需要知道的是,我可以在.getConstructor()中输入什么来指定我要传递的类是它想要的参数的超类

以下是代码的理论示例:

this.listener = (MyListener) listenerClass.getConstructor(Class extends MyAppState.class).newInstance(this);
那么这是可能的,还是我应该使用我的代码创建第二个构造函数来接受MyAppState类,或者其他类似的东西呢

另外,如果这是离题的话,很抱歉,但为了防止将来出现问题,我被告知这个问题是主观的。有没有办法让未来的问题变得不那么主观,或者说判断问题是否主观的方法有点缺陷

[编辑]根据要求,还有几个与问题相关的示例:

    public MyAppState(Node screen, Class listenerClass)
    {
        this.screen = screen;

        try
        {
            this.listener = (MyListener) listenerClass.getConstructor(MyAppState.class).newInstance(this);
        }
        catch (Exception e)
        {
            Logger.getLogger(MyAppState.class.getName()).log(Level.SEVERE, "The listener for the {0} appstate could not be created using reflection.", new Object[]{this.getClass().getName()});
            System.exit(-1);
        }
    }
上面是完整父类的构造函数,所述类扩展了一个以上的类,但它不包含构造函数,因此我不确定是否需要它。如果是,请随意索取

public class OptionsMenuState extends MyAppState
{
    public OptionsMenuState()
    {
        super(new Node("Options Screen"), OptionsMenuStateListener.class);
    }
这是一个类和它的构造函数,为了保持它的简短,将其切块

public class MainMenuState extends MyAppState
{
    public MainMenuState()
    {
        super(new Node("Start Screen"), MainMenuStateListener.class);
    }
这里是另一个类及其构造函数

[编辑]根据建议,我创建了一个程序,大致模拟了我正在尝试的操作

/*打包任何东西;//不要放置包名*/

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        //This is what I want to do but I don't know how to have java allow me to pass in Greeting.
        createObject(SimpleSentence.class);
        createObject(DifferentSentence.class);
    }

    public static void createObject(Class theClass)
    {
        theClass.getConstructor(Greeting.class).newInstance(new Hello());
    }

    class SimpleSentence
    {
        Hello firstWord;

        public SimpleSentence(Hello word)
        {
            firstWord = word;
        }
    }

    class DifferentSentence
    {
        Howdy firstWord;

        public DifferentSentence(Howdy word)
        {
            firstWord = word;
        }
    }

    class Greeting
    {

    }

    class Hello extends Greeting
    {

    }

    class Howdy extends Greeting
    {

    }
}

简单的回答是你不能
getConstructor(Class…parametertypes)
非常明确,因为它只需要匹配零个或一个构造函数

您需要遍历所有构造函数才能找到一个,该构造函数具有可从
MyAppState

e、 g.概述:

    final Constructor<?>[] ctrs = listenerClass.getConstructors();
    for (Constructor<?> constructor : ctrs) {
        if (constructor.getParameterTypes()[0].isAssignableFrom(MyAppState.class)) {
            // use this one?
        }
    }
final构造函数[]ctrs=listenerClass.getConstructors();
对于(建造商:ctrs){
if(constructor.getParameterTypes()[0].isAssignableFrom(MyAppState.class)){
//用这个?
}
}

请给出一个构造函数、其参数和您正在描述的继承层次结构的示例。只需使用一半的信息编辑问题。您的问题仍然不清楚。您的问题包括5种类型,但没有描述类型层次结构。我相信你可以用一个简短而完整的程序来演示这个问题,这个程序会更加清晰。什么是
listenerClass
?也有这种类型的继承层次结构吗?我希望添加一个更简单的示例,这也会带来类似的问题。很抱歉,示例中缺少构造函数和主体,但是我来晚了,但是如果这个问题不完整,我不想一夜之间就把它留下,但是我还需要睡一觉。我想这可能是我需要的答案。谢谢你理解我这个看似复杂的问题。只要没有更简单的方法来做我想做的事,我想你已经明白了!请注意,您可能会找到许多符合您的条件的构造函数,因此请确保您的文档在您的需求中非常具体。您可以做任何事情使其更显式都是好的(例如需要特定的构造函数注释或其他)