[紧急求救]关于动态创建对象的问题

03-03-16 lsj
Class c1 = Class.forname(classname);
Object ob = c1.newInstance();
这种方法只能创建有无参数构造函数的类的实例,但我的类只有带参数的构造函数(得由运行时传入对象参数),所以无法用这种方式

显然,这里应该用到reflect机制,可我就是看不明白javadoc该如何去做,请各位帮帮忙~~~~~~~~~

banq
2003-03-17 21:31
你使用setXXX传入参数可以吗?

Jevang
2003-03-18 03:32
Class c1
try {
parameterTypes = new Class[4];
args = new Object[4];
parameterTypes[2] = Class.forName("Class1"); //$NON-NLS-1$

parameterTypes[1] = parameterTypes[2];
parameterTypes[0] = Class.forName("java.lang.String"); //$NON-NLS-1$
parameterTypes[3] = Class.forName("AnotherClass"); //$NON-NLS-1$

cs = boClass.getConstructor( parameterTypes ); //$NON-NLS-1$
// filter, sorter, session
args[0] = boName;
args[1] = filter;
args[2]= sorter;
args[3]= aSession;
cs.newInstance( args );

}

lsj
2003-03-18 11:57
我的应急办法是用了setXXX方法,虽然是在抽象类中,但总觉得封装得不太好。
谢谢Jevang!

banq
2003-03-18 21:24
Jevang能稍微就你的例子讲解一下的你如何动态创建对象并且传递参数?

lsj
2003-03-19 20:05
大概知道constructor怎么用了,不过感觉这样用reflect不太好
用Class获取运行时讯息效率就不太好了,reflect一下要拿到所有的运行时讯息,威力是不小,可性能上的代价也一定不小。如书上所说,reflect是为工具类准备的。我自己是要在一个对象工厂中动态产生对象,所以或许用reflect反而不合适

各位能说说自己在实践中使用的感觉吗?

Jevang
2003-03-20 03:38
Be aware of the tradeoff between generate and reflection. each approach has its reason to be used.
For sure hard coding is difficult to maintain in complicated system.