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();