如何使用Java文本字段作为类名的输入?

如何使用Java文本字段作为类名的输入?,java,class,jtextfield,Java,Class,Jtextfield,我正在为学校编写一个Java程序(所以:严格的规则…),以图形化的方式可视化数学函数(例如Sin、Cosine和Tangent) 我有两个接口:Function和DifferentiableFunction,每个数学函数都存储在一个扩展Function或DifferentiableFunction的类中 当我启动程序时,我有一个文本字段,我需要在其中写入数学函数的名称(教授将添加它们作为测试),我的想法是能够通过文本字段输入引用类名 问题是:经过几天的搜索,我真的不知道如何做这件事,甚至不知道这

我正在为学校编写一个Java程序(所以:严格的规则…),以图形化的方式可视化数学函数(例如Sin、Cosine和Tangent)

我有两个接口:
Function
DifferentiableFunction
,每个数学函数都存储在一个扩展
Function
DifferentiableFunction
的类中

当我启动程序时,我有一个文本字段,我需要在其中写入数学函数的名称(教授将添加它们作为测试),我的想法是能够通过文本字段输入引用类名

问题是:经过几天的搜索,我真的不知道如何做这件事,甚至不知道这是否可能

请帮帮我,我被卡住了,最后期限快到了

是的,这是(合理的)可能的。虽然我更喜欢使用
JComboBox
,但如果你不能,你就不能

有问题。您的命名样式可能与输入不匹配,因此您需要考虑到这一事实

基本上,您需要的是
JTextField
中的文本和充当函数包名称的前缀

然后您可以使用
Class.forName
查找该类,并使用
Class#newInstance
创建该类的新实例

从这里您需要确定类支持哪个接口,例如

try {
    Class<?> clazz = Class.forName(packagePrefix + "." + functionName);
    Object instance = clazz.newInstance();
    if (instance instanceof DifferentiableFunction) {
        //...
    } else if (instance instanceof Function) {
        //...
    }
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
} catch (InstantiationException ex) {
    ex.printStackTrace();
} catch (IllegalAccessException ex) {
    ex.printStackTrace();
}
试试看{
Class clazz=Class.forName(packagePrefix+“+”函数名);
对象实例=clazz.newInstance();
if(微分函数的实例实例){
//...
}else if(函数实例instanceof){
//...
}
}捕获(ClassNotFoundException ex){
例如printStackTrace();
}catch(实例化异常){
例如printStackTrace();
}捕获(非法访问例外){
例如printStackTrace();
}
现在,正如我所说,这是非常容易出错的,所以你需要小心

另一种方法可能是将每个类的实例加载到某种类型的
映射中,并使用该映射查找所需的函数。

是的,这是(合理的)可能的。虽然我更喜欢使用
JComboBox
,但如果你不能,你就不能

有问题。您的命名样式可能与输入不匹配,因此您需要考虑到这一事实

基本上,您需要的是
JTextField
中的文本和充当函数包名称的前缀

然后您可以使用
Class.forName
查找该类,并使用
Class#newInstance
创建该类的新实例

从这里您需要确定类支持哪个接口,例如

try {
    Class<?> clazz = Class.forName(packagePrefix + "." + functionName);
    Object instance = clazz.newInstance();
    if (instance instanceof DifferentiableFunction) {
        //...
    } else if (instance instanceof Function) {
        //...
    }
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
} catch (InstantiationException ex) {
    ex.printStackTrace();
} catch (IllegalAccessException ex) {
    ex.printStackTrace();
}
试试看{
Class clazz=Class.forName(packagePrefix+“+”函数名);
对象实例=clazz.newInstance();
if(微分函数的实例实例){
//...
}else if(函数实例instanceof){
//...
}
}捕获(ClassNotFoundException ex){
例如printStackTrace();
}catch(实例化异常){
例如printStackTrace();
}捕获(非法访问例外){
例如printStackTrace();
}
现在,正如我所说,这是非常容易出错的,所以你需要小心

另一种方法可能是将每个类的实例加载到某种类型的
映射中,并使用该映射查找所需的函数。

是的,这是(合理的)可能的。虽然我更喜欢使用
JComboBox
,但如果你不能,你就不能

有问题。您的命名样式可能与输入不匹配,因此您需要考虑到这一事实

基本上,您需要的是
JTextField
中的文本和充当函数包名称的前缀

然后您可以使用
Class.forName
查找该类,并使用
Class#newInstance
创建该类的新实例

从这里您需要确定类支持哪个接口,例如

try {
    Class<?> clazz = Class.forName(packagePrefix + "." + functionName);
    Object instance = clazz.newInstance();
    if (instance instanceof DifferentiableFunction) {
        //...
    } else if (instance instanceof Function) {
        //...
    }
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
} catch (InstantiationException ex) {
    ex.printStackTrace();
} catch (IllegalAccessException ex) {
    ex.printStackTrace();
}
试试看{
Class clazz=Class.forName(packagePrefix+“+”函数名);
对象实例=clazz.newInstance();
if(微分函数的实例实例){
//...
}else if(函数实例instanceof){
//...
}
}捕获(ClassNotFoundException ex){
例如printStackTrace();
}catch(实例化异常){
例如printStackTrace();
}捕获(非法访问例外){
例如printStackTrace();
}
现在,正如我所说,这是非常容易出错的,所以你需要小心

另一种方法可能是将每个类的实例加载到某种类型的
映射中,并使用该映射查找所需的函数。

是的,这是(合理的)可能的。虽然我更喜欢使用
JComboBox
,但如果你不能,你就不能

有问题。您的命名样式可能与输入不匹配,因此您需要考虑到这一事实

基本上,您需要的是
JTextField
中的文本和充当函数包名称的前缀

然后您可以使用
Class.forName
查找该类,并使用
Class#newInstance
创建该类的新实例

从这里您需要确定类支持哪个接口,例如

try {
    Class<?> clazz = Class.forName(packagePrefix + "." + functionName);
    Object instance = clazz.newInstance();
    if (instance instanceof DifferentiableFunction) {
        //...
    } else if (instance instanceof Function) {
        //...
    }
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
} catch (InstantiationException ex) {
    ex.printStackTrace();
} catch (IllegalAccessException ex) {
    ex.printStackTrace();
}
试试看{
Class clazz=Class.forName(packagePrefix+“+”函数名);
对象实例=clazz.newInstance();
if(微分函数的实例实例){
//...
}else if(函数实例instanceof){
//...
}
}捕获(ClassNotFoundException ex){
例如printStackTrace();
}catch(实例化异常){
例如printStackTrace();
}捕获(非法访问例外){
例如printStackTrace();
}
现在,正如我所说,这是非常容易出错的,所以你需要小心

另一种方法可能是加载实例