Java:使用生成的字符串调用对象
我想通过使用生成的字符串调用对象 如您所见,Java:使用生成的字符串调用对象,java,object,Java,Object,我想通过使用生成的字符串调用对象 如您所见,name正在正确生成。 此外,获取对象的方法也可以很好地工作。 但是,我不能使用名称引用对象,即使这是对象的名称 为什么呢?我怎样才能解决这个问题 public class FrameTest{ public static void main(String[] args) { ObjectMethod first_object = new ObjectMethod(); //instanciate object
name
正在正确生成。
此外,获取对象的方法也可以很好地工作。
但是,我不能使用名称引用对象,即使这是对象的名称
为什么呢?我怎样才能解决这个问题
public class FrameTest{
public static void main(String[] args) {
ObjectMethod first_object = new ObjectMethod(); //instanciate object
first_object.setCost(2.5);
String object = "first";
String one = "object";
String name = object + "_" + one;
System.out.println(name);
System.out.println(first_object.getCost());
System.out.println(name.getCost()); //this line does not work
}
}
public class ObjectMethod{
public double value;
public void setCost(double cost) {
value = cost;
}
public double getCost() {
return value;
}
}
这不会如您所愿工作,因为您正试图调用字符串名对象上的getCost()。
name-只是一个字符串,但不是ObjectMethod类的对象。您必须理解:Java不是ruby、python或其他动态语言 没有神奇的连接允许您将对字符串的引用转换为其他内容 换句话说:将“object\u one”放入字符串对象的事实不允许将该字符串视为实际变量
object\u one
Java向这个方向发展的一个特性是。但这确实是一个高级话题;在研究这一点之前,您应该了解Java的real基础知识。所以,最好开始
我的意思是:正如“slim”的答案所指出的:您可以使用Map来实现某种“按名称调用”功能。但关键是:这不是“用Java做事情的方式”。Java是一种静态编译语言;当一个人试图突破这个系统,在运行时做一些依赖于平面字符串解析的事情时,使用Java是没有意义的 您不能调用
name.getCost()
,名称的类型是String
,而String没有getCost()
方法。因此,您的代码在此失败
String name = object + "_" + one;
在上面的代码中,您正在为名称
字段赋值“object\u first”
。这意味着,字段name
是String
的类型,其值为“object\u first”
。因此,name
与ObjectMethod
类没有任何关系,因此name.getCost()
毫无意义
基本上,你想要完成的是什么
“我想通过使用生成的字符串调用对象”
除非您使用
反射
否则这是不可能的。除了使用反射(如果您问这个问题,您还没有准备好反射)之外,我能想到的最接近您所描述的内容的方法就是将字符串映射到对象
Map<String,Runnable> options = new HashMap<>();
options.add("getCost", new CostGetter(...));
options.add("getDescription", new DescriptionGetter(...));
String command = getCommandFromUi();
options.get(command).run();
看看任何一本关于设计模式的书中的命令和策略模式。java是一个
这意味着您必须定义一个变量,并在使用它之前指定变量类型,并且(强调我的)
某些操作可能只允许该类型*
就因为你这么做:
String objectName;
Object comboValue = departingStop.getSelectedItem();
Object combo2Value = finalStop.getSelectedItem();
objectName = comboValue + "_" + combo2Value;
这并不意味着现在objectName从字符串变为组合框
想象一下这有多可怕:
Car tata = new Car();
Robot kuka = new Robot();
String foo = tata.getName() + kuka.getName();
现在什么是福?变压器??不
还是一串。。。
因为这是一个字符串,你不能这样做
因为它不是汽车,也不是foo.weld();因为它不是机器人我想你需要说出你想要实现的目标。看起来好像你正在尝试做一些应该用不同的方式来做的事情。如果你说你在寻找什么样的任务,我们也许能帮上忙。我过去有过,人们告诉我要缩短和缩小我的问题。基本上,我有两个组合框,a和b。两个组合框都包含1和2。我创建了两个对象。1_2 和2_1。我正试图使它基于组合框中选择的值,一个特定的对象将被引用。我的解决方案是创建带有组合框值的对象,组合框的值由x连接。然后,我可以根据组合框的选定值引用这些对象。我不确定这是否有意义,希望我能说清楚。@JonGoe如果组合中只有两个对象,为什么不使用if/else语句呢?op希望(有很多机会)从字符串类中的ObjectMethod调用一个方法。。。所有问题都指向同一点:这是一个很好的观点;我投你一票。尽管我仍然认为OP是走错了方向。他应该理解Java的静态类型本质;而不是试图在动态脚本语言心智模型中使用Java。但正如所说;你得到了我的选票;-)@幽灵猫明白了。我做了25个if语句,每个语句根据组合框的不同值调用不同的对象。我会寻找更好的,但现在它起作用了。谢谢
Car tata = new Car();
Robot kuka = new Robot();
String foo = tata.getName() + kuka.getName();