gpt4 book ai didi

java - 如何使用反射获取构造函数,在该构造函数中传递父类(super class)作为参数

转载 作者:行者123 更新时间:2023-12-01 12:47:32 26 4
gpt4 key购买 nike

今天,在编码时,我开始深入研究反射的世界。我以前曾把它弄乱过,但从来没有达到这种程度,无论我在哪里看,我都找不到我的问题的答案,所以我在这里!目前我正在尝试做的是对其构造函数请求参数的类使用反射,但为了便于使用,我希望使用参数的父类(super class)。

这是导致问题的代码并附有一些解释:

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 类的构造函数,或者其他类似的东西。

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

[编辑]根据要求,再提供一些与该问题相关的示例:

    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 分配的参数的构造函数。

例如概要:

    final Constructor<?>[] ctrs = listenerClass.getConstructors();
for (Constructor<?> constructor : ctrs) {
if (constructor.getParameterTypes()[0].isAssignableFrom(MyAppState.class)) {
// use this one?
}
}

关于java - 如何使用反射获取构造函数,在该构造函数中传递父类(super class)作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24545654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com