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)