实际的答案是:一般来说,您不应该在运行时使用字符串来访问您的变量。这实际上是合适的情况很少而且相距甚远,您的示例虽然可能是为了说明目的而进行了简化,但并不适合它。
相反,您为什么不简单地使用集合或数组来存储您的对象?@TRRohith 在他们的回答中举了一个例子。
不过,下面给出了您的问题的直接答案,因为它适用于 Java。虽然 C# 的代码会有所不同,但可用于此目的的语言功能,即反射,在 C# 中也可用。
如果Obj1
等Obj2
被声明为类中的静态或实例字段,您可以使用反射通过它们的名称获取它们的值(参见Java 的相关文档)。如果它们是方法的本地,则没有简单的方法可以这样做(请参阅这些问题:对于 Java,对于 C#)。
静态字段
class Something {
static Object obj1 = new Object();
static Object obj2 = new Object();
// etc.
}
(我冒昧地以小写字母开头字段名称,因为它是 Java 中公认的做法。)
在这种情况下,您可以使用以下代码通过其名称获取变量的值(您需要 import java.lang.reflect.Field
):
// Get field, named obj1, from class Something.
Field f = Something.class.getDeclaredField("obj1");
// This line allows you access the value of an inaccessible (non-public) field.
f.setAccessible(true);
// Assigning the value of the field, named obj1, to obj.
// You may want to cast to a more concrete type, if you know exactly what is stored in obj1.
// The parameter for get() is ignored for static fields, so simply pass null.
Object obj = f.get(null);
// Now you can do whatever you want with obj,
// which refers to the same object as static field obj1 of Something.
System.out.println(obj);
实例字段
class Something {
Object obj1 = new Object();
Object obj2 = new Object();
// etc.
}
对于实例字段,您可以以几乎完全相同的方式执行此操作,您只需要将类的实例传递给f.get()
. 因此,为了举例,让我们假设我们有一个 class 的实例Something
,称为sth
。
// Let's say this is an instance of our class
Something sth = new Something();
// ...
// Get field, named obj1, from class Something.
Field f = Something.class.getDeclaredField("obj1");
// This line allows you access the value of an inaccessible (non-public) field.
f.setAccessible(true);
// Assigning the value of the field, named obj1, to obj.
// You may want to cast to a more concrete type, if you know exactly what is stored in obj1.
// The parameter for get() is the instance of Something,
// for which you want to retrieve the value of an instance field, named obj1.
Object obj = f.get(sth);
// Now you can do whatever you want with obj,
// which refers to the same object as instance field obj1 of sth.
System.out.println(obj);
局部变量
在这种情况下,您可能不走运。同样,请参阅以下链接:Java、C#。