2017-05-05 139 views
-1

我想通过使用生成的字符串调用对象。Java:使用生成的字符串调用对象

正如您所见,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; 
    } 
} 
+0

我认为你需要说你想要达到的目标。它看起来好像你正试图做一些应该以不同方式完成的事情。 我们也许可以帮助,如果你说的任务是什么 – Richard

+1

是[这](http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-方法名称作为字符串)你在找什么? – Oswald

+0

我在过去曾有人告诉我要缩短和缩小我的问题。基本上,我有两个组合框,a和b。两个组合框都包含1和2.我创建了两个对象。 1_2和2_1。我试图根据在组合框中选择的值来制作一个特定的对象。我的解决方案是用_连接的组合框的值创建对象。然后我可以根据组合框的值选择值来引用这些对象。我不确定这是否有意义,希望我能说清楚。 –

回答

1

这是行不通的,因为你总是试图在字符串名称对象调用getCost()名称 - 只是一个字符串,而不是ObjectMethod类的对象。

2

你必须明白:Java不是Ruby或Python或其他动态语言。

有没有魔术连接,可以让你把一个字符串的引用变成别的东西。

换句话说:您将“object_one”放入字符串对象的事实不允许您将对待表示字符串,如某些实际变量​​。

进入该方向的Java的一个特征是reflection。但这确实是一个先进的话题;在你研究之前,你应该了解Java的基本知识。所以,最好从here开始。

我的意思是:正如“苗条”的答案指出:您可以使用地图来实现某种“按名称呼叫”功能。但重点是:这不是“你如何在Java中做事”。 Java是一种静态编译的语言;而当使用Java试图摆脱该系统并执行依赖于平面字符串解析的运行时,没有任何意义。

0

您不能调用name.getCost(),并且名称的类型为String,并且字符串不具有getCost()方法。因此,你的代码在这里失败。

String name = object + "_" + one; 

在上述代码中,用值"object_first"分配name字段。这意味着,字段name是类型String,其值为"object_first"。所以,nameObjectMethod类没有任何关系,因此name.getCost()是没有意义的。

基本上,你所要完成

什么“我想通过使用生成的字符串来调用对象”

除非你使用reflection是不可能的。

2

对于您所描述的内容,使用反射(如果您问这个问题,您还没有准备好反射),我可以想到最接近您的内容的一个字符串映射到对象。

Map<String,Runnable> options = new HashMap<>(); 
    options.add("getCost", new CostGetter(...)); 
    options.add("getDescription", new DescriptionGetter(...)); 

    String command = getCommandFromUi(); 
    options.get(command).run(); 

这可能是Callable,而不是Runnable。它可能是你自己的界面。在Java 8可能是Supplier,你可以通过lambda表达式:

options.add("getCost",() -> currentUser.price()); 

在任何书籍设计模式来看看命令和策略模式。

+0

这是一个好点;你得到了我的投票。虽然我仍然认为OP是在错误的兔子洞里。他应该理解Java的静态类型本质;而不是试图在动态脚本语言心智模型中使用Java。但如前所述;你在这里得到我的投票;-) – GhostCat

+0

@GhostCat了解。我根据组合框的不同值创建了25条if语句,每条语句都调用不同的对象。我会寻找更好的东西,但现在它可以工作。谢谢 –

0

Java是一种Strong typed language 这意味着你必须定义一个变量,你使用它,(重点煤矿) 某些操作可能会允许仅适用于此类型之前还指定变量类型*

只是因为你这样做:现在OBJECTNAME从字符串突变成一个组合框

String objectName; 
Object comboValue = departingStop.getSelectedItem(); 
Object combo2Value = finalStop.getSelectedItem(); 
objectName = comboValue + "_" + combo2Value; 

平均不到风度......

想象多么可怕,这可能是:

Car tata = new Car(); 
Robot kuka = new Robot(); 
String foo = tata.getName() + kuka.getName(); 

什么现在是富?变压器? NO, 仍然是一个字符串... 因为这是你不能做 foo.drive()的字符串,因为不是汽车,也不foo.weld();因为是不是机器人