Java 内部类中公共无参数构造函数的NoSuchMethodException
我在一个内部类中定义了一个公共的无参数构造函数,当我调用Java 内部类中公共无参数构造函数的NoSuchMethodException,java,android,Java,Android,我在一个内部类中定义了一个公共的无参数构造函数,当我调用getConstructor()时,我的代码不断抛出一个nosuchMethodoException 我使用以下命令调用外部类中的问题方法: addListeners( info_boxes, InfoBoxListener.class.getName() ); 我的内心世界: public class InfoBoxListener implements View.OnClickListener { public InfoBox
getConstructor()
时,我的代码不断抛出一个nosuchMethodoException
我使用以下命令调用外部类中的问题方法:
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)
{
}
}
private void addListeners(列表视图、字符串类名称)
{
尝试
{
Class clazz=Class.forName(Class_name);
构造函数ctor=clazz.getConstructor();//异常
用于(视图:视图)
{
Object=ctor.newInstance();
view.setOnClickListener((view.OnClickListener)对象);
}
}
catch(classnotfounde异常)
{
Log.i(“我的”,“未找到类:”+e.getMessage());
}
捕获(无此方法例外)
{
Log.i(“我的”,“未找到方法:”+e.getMessage());
}
捕获(例外e)
{
}
}
我的谷歌fu让我失望了。我到底做错了什么?在Java中,如果不将外部类作为参数传递,就不能调用内部类的构造函数,请按如下方式执行:
Class<?> outerClass = Class.forName("myOuterClassName");
Object outerInstance = outerClass.newInstance();
Class<?> innerClass = Class.forName("myInnerClassName");
Constructor<?> ctor = innerClass.getDeclaredConstructor(outerClass);
Object innerInstance = ctor.newInstance(outerInstance);
Class outerClass=Class.forName(“myOuterClassName”);
对象outerInstance=outerClass.newInstance();
Class innerClass=Class.forName(“myInnerClassName”);
构造函数ctor=innerClass.getDeclaredConstructor(outerClass);
对象innerInstance=ctor.newInstance(outerInstance);
您的内部类不是静态的,因此它需要引用外部类的实例。这是通过向构造函数添加一个隐藏参数来实现的,但是通过反射,它不会隐藏
要了解这一点,请创建一个小型测试程序:
public class Test {
public class InfoBoxListener
{
public InfoBoxListener()
{
}
}
public static void main(String[] args) {
for (Constructor<?> constructor : InfoBoxListener.class.getConstructors()) {
System.out.println(constructor);
}
}
}
如您所见,构造函数接受一个
测试
参数。@GingerHead,但我将展示如何自己研究它:-PI在你回复之前偶然发现了这篇文章,其中一个答案提到内部类必须是静态的:我喜欢你的答案,因为它允许我将内部类保持为非静态的。你可以省去命名外部类的需要,因为您在命名内部类时已经对其进行了命名:class outerClass=innerClass.getEnclosuringClass()
。是的,您也可以这样做
public Test$InfoBoxListener(Test)