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