【问题标题】:java String to classjava字符串到类
【发布时间】:2011-05-01 03:29:20
【问题描述】:

我有一个名为Bean1 的bean 类。在我的主要方法中,我有一个包含变量名称的字符串:

String str= "Bean1"; 

现在如何使用String 变量来获取类并访问 Bean 属性?

【问题讨论】:

  • 试图实现的功能是“在应用程序运行时创建了一个 Inetrface 和相关的 Bean 类。我能够获取 bean 类和接口所在的路径位于。现在我有一个类“SrcInfo”,其中方法列表和 Bean 的参数作为类变量提供。现在我必须动态创建一个 java 类,我需要创建一个将 Bean 对象作为参数的方法并通过操作 Bean 对象中包含的数据返回一个 HashMap。因此我将 bean 类名作为字符串变量

标签: java variable-variables


【解决方案1】:

一步一步:

//1. As Kel has told you (+1), you need to use 
//Java reflection to get the Class Object.
Class c = Class.forName("package.name.Bean1");

//2. Then, you can create a new instance of the bean. 
//Assuming your Bean1 class has an empty public constructor:
Object o = c.newInstance();

//3. To access the object properties, you need to cast your object to a variable 
// of the type you need to access
Bean1 b = (Bean1) o;

//4. Access the properties:
b.setValue1("aValue");

对于这最后一步,您需要知道 bean 的类型,或者具有您需要访问的属性的超类型。而且我猜你不知道,如果你在这个类上的所有信息都是一个带有它的名字的字符串。

使用反射,您可以访问类的方法,但在这种情况下,您需要知道要调用的方法的名称和输入参数类型。 继续示例,更改步骤 3 和 4:

// 3. Get the method "setValue1" to access the property value1, 
//which accepts one parameter, of String type:
Method m=c.getMethod("setValue1", String.class);

// 4. Invoke the method on object o, passing the String "newValue" as argument:
m.invoke(o, "newValue");

如果您没有在运行时获得所有这些信息,也许您需要重新考虑您的设计。

【讨论】:

    【解决方案2】:

    Does Java support variable variables? 的副本

    Java 不支持根据名称字符串动态获取变量(也称为变量变量)。可能有不同的方式来做你想做的事情,例如使用 Map 对象将名称映射到 bean。如果您编辑您的问题以更详细地解释您想要做什么,我们可能会提供一些更具体的答案。

    (另一方面,如果问题是关于一个名为 Bean1 的类,那么 Kel 是对的。)

    【讨论】:

      【解决方案3】:

      您应该使用 Java 反射 API:

      Class c = Class.forName("package.name.Bean1");
      

      然后你可以使用c.newInstance() 来实例化你的类。此方法使用不需要参数的构造函数。

      在此处查看详细信息:http://download.oracle.com/javase/tutorial/reflect/

      【讨论】:

      • 他可能还需要一个 Bean1 的实例
      • 试图实现的功能是“在应用程序运行时创建了一个 Inetrface 和相关的 Bean 类。我能够获取 bean 类和接口所在的路径位于。现在我有一个类“SrcInfo”,其中方法列表和 Bean 的参数作为类变量提供。现在我必须动态创建一个 java 类,我需要创建一个将 Bean 对象作为参数的方法并通过操作 Bean 对象中包含的数据返回一个 HashMap。因此我将 bean 类名作为 String 变量。
      • @MANU SINHA:您应该在问题中包含此信息(请编辑它)。这是获得有用答案的重要信息
      • 坦率地说,我不了解您要实施的完整工作流程。如果您需要按名称实例化类 - 使用我或 Tomas Narros 提供的解决方案。如果您需要访问实例字段并将它们转换为 HashMap - 使用 Class.getDeclaredFields() 和 Field.get() 方法。您可以查看相应的 JavaDoc 了解详细信息 (download.oracle.com/javase/6/docs/api/java/lang/Class.html),或者再问一个问题了解更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多