2012-04-18 61 views
0

假设我有ClassA和ClassB的(通用),参考http://www.exampledepot.com/egs/java.lang.reflect/Constructors.html获取对象的类和它的构造,反思的Android

我传递一个customobject从CLASSA到ClassB的,现在我想customobject的构造函数CLASSB和呼叫它

CLASSA

customclass objCustomclass; 

classB mClassB; 

mClassB.getConstructorAndCall(objCustomclass); 

CLASSB

public void getConstructorAndCall(Object objCustomclass); 

try { 
    Object filledObject = objCustomclass.getClass().newInstance(); 
     // here i need to call filledObject's contructor 
} catch (Exception e) { } 

我能够创建对象作为自定义对象的实例,但构造函数呢?

说明:getConstructorAndCall()是一个通用方法,该对象是未知类型,意味着任何类都可以传递它的对象。

谢谢。

回答

0

从JavaDoc中的java.lang.Class(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#newInstance()):

创建此Class对象所表示的类的新实例。 该类被实例化,好像通过表达式与 参数列表。如果尚未初始化 ,则该类将被初始化。

I. E. newInstance()方法总是使用默认构造函数。

大多数时候我看到有人使用新的实例并需要特定的构造函数或签名,这恰好是由于解决方案设计缺乏。您可能需要仔细检查一个模式是否适用于您需要的解决方案。

+0

,您在执行的角度来看,它指向:还有更复杂,比如,传递参数的功能,可以通过做什么? – 2012-04-18 05:46:40

+0

有点。我的意思是,不要求特定的构造函数,而是要确保总是调用某个特定的方法(init或其他)。例如,您可以通过工厂来实现此目的。 – 2012-04-18 05:47:57

+0

幸运的是,如果它不是构造函数,而是init,那么你可以通过反射参数来调用它。 – 2012-04-18 05:48:30

1

那么如果构造函数是空的,那么我认为你应该运行构造函数。

Constructor[] constructors = objCustomClass.getClass().getConstructors() 
for (int i = 0; i < constructors.length; i++) { 
    Constructor c = constructors[i]; 
    Class[] paramTypes = c.getParameterTypes(); 
    Object[] params; 
    // do fancy stuff here - it helps if you know what the constructors take beforehand 
    Object filledObject = c.newInstance(params); 
} 

Constructor with parameters

+1

但用参数调用不适用于构造函数。这就是我谈到解决方案设计的原因。我想他可能需要原型化他的对象或类似的东西,而不是仅仅依靠构造函数。 – 2012-04-18 05:46:07

+0

@VicentePlata同意,但在任何结论之前使用搜索解决方法 – 2012-04-18 05:53:27

+0

@VicentePlata您是指参数不适用于构造函数? http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object []) – JRaymond 2012-04-18 15:09:45