2014-03-07 77 views
4

我有一个要求,我必须写一个接受“字符串”的方法,并基于这个字符串,我需要返回一个MyObject类型的对象。这可以通过使用开关盒来完成,但是如何动态地实现这一点。基于java输入字符串名称的返回对象

在下面的例子中,可以通过给“myObject1”作为字符串来调用方法,那么这个方法应该返回myObject1对象。这怎么可能做到。

public class HelloWorld { 

    MyObject myObject1 = new MyObject(); 
    MyObject myObject2 = new MyObject(); 
    MyObject myObject3 = new MyObject(); 


public MyObject getMyObject(String string) 
{ 
    return <<myObject1 or 2 or 3 based on string parameter name>>; 
} 

} 


class MyObject { 

} 
+1

准备一个'Map '并在'getMyObject()中使用它' –

+0

您可以使用反射来实现,但我建议使用'Map ' –

+0

'''I有一个要求我真的很想知道是谁创造了这个要求。 – NeplatnyUdaj

回答

1

如果你真的想做这种反射的东西是你的朋友。您可以按名称查找声明的字段,然后使用它们查找实例变量。

我修改了您的示例以包含一个查找MyObject的每个实例并且还有一个失败案例的主要方法。我还修改了MyObject,以便您可以轻松地确定找到了哪个实例。

import java.lang.reflect.Field; 

public class Reflection { 

    MyObject myObject1 = new MyObject("1"); 
    MyObject myObject2 = new MyObject("2"); 
    MyObject myObject3 = new MyObject("3"); 

    public MyObject getMyObject(final String string) { 
     try { 
      final Field declaredField = this.getClass() 
        .getDeclaredField(string); 
      final Object o = declaredField.get(this); 
      if (o instanceof MyObject) { 
       return (MyObject) o; 
      } 

     } catch (final Exception e) { 
     } 
     return null; 
    } 

    class MyObject { 
     final String name; 

     public MyObject(final String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      // TODO Auto-generated method stub 
      return name; 
     } 

    } 

    public static void main(final String[] args) { 
     final Reflection r = new Reflection(); 
     System.out.println(r.getMyObject("myObject1")); 
     System.out.println(r.getMyObject("myObject2")); 
     System.out.println(r.getMyObject("myObject3")); 
     System.out.println(r.getMyObject("invalid")); 
    } 

} 

在Java Java documentation中有关于反射的一些有用信息。

+0

工作就像一个魅力!寻找这样的东西......感谢一吨 – user3393249

1

这可以通过反射动态完成,但它是非常不切实际和不必要的。您应该使用switchMap将您的字符串标识符与您的实际对象相关联。

Map<String, MyObject> identifiers = new HashMap<>(); 

... 
identifiers.put("myObject1", myObject1); 
identifiers.put("myObject2", myObject2); 
identifiers.put("myObject3", myObject3); 
... 

public MyObject getMyObject(String string) { 
    return identifiers.get(string); 
} 
+0

这不完全正确,字段名称可通过反射获得。我不推荐在一般用途中使用反射,但它可能会有所帮助。 –

+0

@RichardMiskin是的,我想这是真的。我在考虑局部变量;我会编辑以反映这一点。但是,我认为反思在这里完全没有必要。在这种情况下的反思只是做一些应该很简单的事情的迂回方式。 – arshajii

0

您可以使用:

Class<?> clazz = Class.forName(className); 
Object object = clazz.newInstance(); 

其中的className - 所需 类的全名见http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html的细节

+0

'Class.forName()'返回一个'Class'实例;这对此无济于事。 (-1) – arshajii

+0

如果你有一个你的对象的类,你可以通过newInstance()方法创建对象的实例。 – Megaprog

+0

这不是OP想要的(参考问题)。 – arshajii