Android动态类创建提供了java.lang.InstantiationException

时间:2011-06-28 18:34:27

标签: android class dynamic instantiationexception

当我尝试创建Android UI Component的动态实例时,它会给我“java.lang.InstantiationException”。

示例代码:

Class components[] = {TextView.class, Button.class,...}
Component mControl = null;
...
...
mControl = (Component) components[nIndexOfControl].newInstance();

有人可以指导我,实现上述目标的最佳方式是什么,因为我想为每个小部件保存if..else?

3 个答案:

答案 0 :(得分:2)

TextView类没有默认构造函数。三个可用的构造函数是:

TextView(Context context)
TextView(Context context, AttributeSet attrs)
TextView(Context context, AttributeSet attrs, int defStyle)

Button类同样如此:

public Button (Context context)
public Button (Context context, AttributeSet attrs)
public Button (Context context, AttributeSet attrs, int defStyle) 

您需要传递至少Context变量来实例化所有UI(View)控件的后代。


下一步更改您的代码:

Context ctx = ...;
Class<?> components[] = {TextView.class, Button.class };
Constructor<?> ctor = components[nIndexOfControl].getConstructor(Context.class);
Object obj = ctor.newInstance(ctx);

答案 1 :(得分:0)

View objects没有默认构造函数。看一下Class.newInstance()的javadoc。如果找不到匹配的构造函数,它会抛出InstantiationException

答案 2 :(得分:0)

我在Google上搜索了“java class.newInstance”和:

a)我找到了java.lang.Class类的文档,它解释了引发此异常的确切环境:

InstantiationException - if this Class represents an abstract class, an
interface, an array class, a primitive type, or void; or if the class has
no nullary constructor; or if the instantiation fails for some other reason.
b)建议的搜索词是“带有参数的java class.newinstance”,它找到了几种处理“class has no Nullary constructor”的方法,包括StackOverflow的一些结果。

您的类列表中没有数组类,基本类型或“void”,并且“其他原因”不太可能(并且无论如何都会在异常消息中解释)。如果类是抽象的或接口,那么你根本无法以任何方式实例化它。