我在内部类中定义了一个公共无参构造函数,当我调用NoSuchMethoException
时,我的代码不断抛出getConstructor()
。
我使用:
在外部类中调用问题方法addListeners( info_boxes, InfoBoxListener.class.getName() );
我的内心课程:
public class InfoBoxListener implements View.OnClickListener
{
public InfoBoxListener()
{
//Why isn't this constructor being found?
}
@Override
public void onClick(View view)
{
//some code
}
}
抛出异常的方法:
private void addListeners( List<View> views, String class_name )
{
try
{
Class<?> clazz = Class.forName( class_name );
Constructor<?> ctor = clazz.getConstructor(); //EXCEPTION
for ( View view : views )
{
Object object = ctor.newInstance();
view.setOnClickListener( (View.OnClickListener) object );
}
}
catch (ClassNotFoundException e)
{
Log.i("mine", "class not found: " + e.getMessage() );
}
catch (NoSuchMethodException e)
{
Log.i("mine", "method not found: " + e.getMessage() );
}
catch (Exception e)
{
}
}
我的google-fu让我失望了。世界上我做错了什么?
答案 0 :(得分:6)
在Java中,你不能在不将外部类作为参数传递的情况下调用内部类的构造函数,这样做:
callback
答案 1 :(得分:2)
您的内部类不是Class<?> outerClass = Class.forName("myOuterClassName");
Object outerInstance = outerClass.newInstance();
Class<?> innerClass = Class.forName("myInnerClassName");
Constructor<?> ctor = innerClass.getDeclaredConstructor(outerClass);
Object innerInstance = ctor.newInstance(outerInstance);
,因此需要引用外部类的实例。这是通过向构造函数添加隐藏参数来完成的,但是使用反射时,它不会被隐藏。
要看到这一点,请创建一个小型测试程序:
static
输出
public class Test {
public class InfoBoxListener
{
public InfoBoxListener()
{
}
}
public static void main(String[] args) {
for (Constructor<?> constructor : InfoBoxListener.class.getConstructors()) {
System.out.println(constructor);
}
}
}
如您所见,构造函数采用public Test$InfoBoxListener(Test)
参数。