内部类中的公共无参数构造函数的NoSuchMethodException

时间:2015-08-30 22:47:53

标签: java android

我在内部类中定义了一个公共无参构造函数,当我调用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让我失望了。世界上我做错了什么?

2 个答案:

答案 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) 参数。