首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中从字符串创建新对象

在Java中从字符串创建新对象
EN

Stack Overflow用户
提问于 2009-08-12 21:27:42
回答 5查看 84.9K关注 0票数 69

在Java中,有没有办法从字符串变量创建一个新类?

代码语言:javascript
复制
String className = "Class1";
//pseudocode follows
Object xyz = new className(param1, param2);

另外,如果可能的话,结果对象必须是Object类型吗?

也许有一种更好的方法,但我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并且派生自相同的父类,因此我将能够调用该类中的特定方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-12 21:38:48

这就是你想要做的:

代码语言:javascript
复制
String className = "Class1";
Object xyz = Class.forName(className).newInstance();

请注意,newInstance方法不允许使用参数化构造函数。(请参阅Class.newInstance documentation

如果你确实需要使用参数化的构造函数,这就是你需要做的:

代码语言:javascript
复制
import java.lang.reflect.*;

Param1Type param1;
Param2Type param2;
String className = "Class1";
Class cl = Class.forName(className);
Constructor con = cl.getConstructor(Param1Type.class, Param2Type.class);
Object xyz = con.newInstance(param1, param2);

请参阅Constructor.newInstance documentation

票数 124
EN

Stack Overflow用户

发布于 2009-08-12 21:31:14

可以,您可以使用反射、使用Class.forName(名称)、抓取构造函数并调用它,在给定字符串名称的类路径上加载一个类。我来给你举个例子。

假设我有一个类:

代码语言:javascript
复制
com.crossedstreams.thingy.Foo

它有一个带签名的构造函数:

代码语言:javascript
复制
Foo(String a, String b);

我将根据这两个事实实例化这个类,如下所示:

代码语言:javascript
复制
// Load the Class. Must use fully qualified name here!
Class clazz = Class.forName("com.crossedstreams.thingy.Foo");

// I need an array as follows to describe the signature
Class[] parameters = new Class[] {String.class, String.class};

// Now I can get a reference to the right constructor
Constructor constructor = clazz.getConstructor(parameters);

// And I can use that Constructor to instantiate the class
Object o = constructor.newInstance(new Object[] {"one", "two"});

// To prove it's really there...
System.out.println(o);

输出:

代码语言:javascript
复制
com.crossedstreams.thingy.Foo@20cf2c80

有很多资源详细介绍了这一点,你应该意识到你引入了一个编译器无法为你检查的依赖项-如果你拼错了类名或任何东西,它将在运行时失败。此外,在此过程中可能会抛出许多不同类型的异常。不过,这是一种非常强大的技术。

票数 14
EN

Stack Overflow用户

发布于 2009-08-12 21:43:12

这应该是可行的:

代码语言:javascript
复制
import java.lang.reflect.*;

FirstArgType arg1;
SecondArgType arg2;
Class cl = Class.forName("TheClassName");
Constructor con = cl.getConstructor(FirstArgType.class, SecondArgType.class);
Object obj = con.newInstance(arg1, arg2);

从那里你可以转换成一个已知类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1268817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档