gpt4 book ai didi

java 从字符串中加载类

转载 作者:行者123 更新时间:2023-11-29 06:03:22 25 4
gpt4 key购买 nike

我有特定的类需要加载。名称存储在字符串数组中。我可以加载特定类,但无法正确操作。

String [] myClassesList = {"Class1", "Class2", "Class3"...};
FileClassLoader loader = new FileClassLoader("MyClassesPath");

Class [] c = new java.lang.Class[myClassesList.length];

for(int i=0; i<myClassesList.length; i++){
c[i]=loader.loadClass (myClassesList[i]);
... //This work proprely
}

但我不能

  c[i] myNewCi = new c[i].<constructor>();

注意:我所有的类都是扩展的 JPanel。我需要添加到 jTabbedPane。我正在尝试执行以下代码。

...
myPanelClass myPanel = new myPanelClass();
jTabbedPane1.addTab("myPanelName", myPanel);
... //This work proprely

任何反馈都会有所帮助。谢谢!

最佳答案

如果您只需要让该类扩展 JPanel 以便将其添加到选项卡,请尝试以下操作。

Class<? extends JPanel> c =  Class.forName(myClassesList[i]).asSubclass(JPanel.class);
JPanel panel = c.newInstance();
jTabbedPane1.addTab(panel);

这将创建一个扩展 JPanel 的新类(使用反射),但除非对其进行类型转换,否则其功能将受到限制。

如果您决定需要与类进行更多交互(调用其他方法等)并且不想进行类型转换,则必须为类定义契约。这意味着在您的类之间添加一个抽象类,并让抽象类扩展 JPanel。这是一个例子。

定义抽象类。这将在您的类中包含您想要的任何额外方法名称

public abstract class ATest extends JPanel{
public abstract String doSomething();
}

然后你必须实现你的具体类

public class Class1 extends ATest{
public Class1(){
//init me
}

@Override
public String doSomething() {
return "Class 2";
}
}

现在你可以自由地初始化类并使用反射做你想做的事

Class<? extends ATest> c =  Class.forName(myClassesList[i]).asSubclass(ATest.class);
ATest panel = c.newInstance();

System.out.println(panel.doSomething());
jTabbedPane1.addTab(panel);

关于java 从字符串中加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346569/

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