s.v*_*s.v 3 java reflection constructor
经过漫长的一天搜索,如果构造函数采用非原始参数,我仍然无法弄清楚如何从自制类中实现新对象.现在我开始怀疑这是否可行?!
在Reflection的文档中,就我所见,他们只讨论基本类型(如int,float,boolean等).我发现的所有其他信息/网站/研讨会/示例也只是考虑原始类型来查找构造函数并实例化一个新实例.
所以我想要做的是以下(细分场景):
假设我有一个名为MyStupidClass的类.另一个类(我们将其命名为MyUsingClass)将MyStupidClass对象作为构造函数中的参数.现在在我的主应用程序中,我希望能够加载MyUsingClass类并将构造函数中的对象实例化.
这是我到目前为止发现的"使用反射":
使用空构造函数:
//the MyUsingClass:
public class MyUsingClass {
//the public (empty) constructor
public MyUsingClass() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在主应用程序中,我现在会做类似的事情:
//get the reflection of the MyUsingClass
Class<?> myUsingClassClass = Class.forName("MyUsingClass");
//get the constructor [I use getConstructor() instead of getConstructors(...) here as I know there is only one]
Constructor<?> myUsingClassConstr = myUsingClassClass.getConstructor();
//instanciate the object through the constructor
Object myInstance = myUsingClassConstr.newInstance(null);
Run Code Online (Sandbox Code Playgroud)
现在如果我在MyUsingClass中使用一些原始类型,它看起来像:
//the MyUsingClass:
public class MyUsingClass {
//the public (primitive-only) constructor
public MyUsingClass(String a, int b) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在主应用程序中,最后一行将更改为:
//instanciate the object through the constructor
Object myInstance = myUsingClassConstr.newInstance(new Object[]{new String("abc"), new Integer(5)});
Run Code Online (Sandbox Code Playgroud)
到目前为止没有任何问题(上面的代码中可能存在一些小错误,因为它只是一个细分的例子......)现在线索的问题是,如果MyUsingClass看起来像这样,我怎样才能创建myInstance:
//the MyUsingClass:
public class MyUsingClass {
//the public (primitive-only) constructor
public MyUsingClass(String a, int b, MyStupidObject toto) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
?任何帮助,将不胜感激!感谢您阅读我的问题!
迎接sv
Ale*_*exR 13
没问题.很多年前,我也花了很多时间来做这件事.
Class.newInstance()只有在调用默认构造函数时才能使用.getConstructor()并调用它来找到适当的构造函数newInstance().当你调用getConstructor()使用int.class,long.class,boolean.class,等原语.如果你的班级Foo有构造函数,Foo(int p)你必须说
Constructor c = Foo.class.getConstructor(int.class);
一旦你有构造函数使用newInstance()调用它:
c.newInstance(12345);
对于多参数构造函数,请说如下:
`c.newInstance(new Object[] {12345, "foo", true})`
Run Code Online (Sandbox Code Playgroud)
请注意,自java 5以来我们有幸运行自动装箱.对于5之前的版本,我们必须使用更详细的语法:
`c.newInstance(new Object[] {new Integer(12345), "foo", new Boolean(true)})`
Run Code Online (Sandbox Code Playgroud)
即我们使用int.class来定位构造函数和Integer类型来调用它.
我希望这有帮助.