2016-03-09 82 views
3

我的代码在顶层模块下面一行:如何通过反射正确实例化内部类?

String username = "[email protected]" 
ModelBuilder userBuilder = utilityManager.getUtility("user").generateBuilder(username); 

在我的“用户”实用工具类,我有以下几点:

private class UserBuilder extends ModelBuilder { 
    private final String username; 

    public UserBuilder(String username) { 
     this.username = username; 
    } 

    @Override 
    public User execute() { 
     return populateUserInformation(username); 
    } 
} 

@Override 
public UserBuilder generateBuilder(Object... arguments) throws ReflectiveOperationException { 
    try { 
     return UserBuilder.class.getConstructor(String.class).newInstance((String) arguments[0]); 
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) { 
     throw new ReflectiveOperationException(e); 
    } 
} 

我试图使用generateBuilder(对象... arguments)方法返回我的UserBuilder类的新实例(作为模型构建器),但是,当我运行代码时,出现以下异常:

nested exception is java.lang.ReflectiveOperationException: java.lang.NoSuchMethodException: 
com.login.util.UserOperationsUtility$UserBuilder.<init>(java.lang.String)] with root cause 
java.lang.NoSuchMethodException: com.login.util.UserOperationsUtility$UserBuilder.<init>(java.lang.String) 
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_66] 
at java.lang.Class.getConstructor(Class.java:1825) ~[na:1.8.0_66] 

我试图遵循构造函数的java文档,但我不知道如何调试。我对Java的反射能力的了解很少。

回答

5

问题的getConstructor文档中显式指定:

如果此Class对象表示非静态上下文中声明的内部类,正式的参数类型包括显式外围实例作为第一个参数。

这是这种情况,你有一个内部的,非static类。事实上,您也需要在编译时通过封闭类的实例限定UserBuilder对象的实例化,在使用反射时也是如此。你有两个选择:

  • 使class静态
  • 查找正确的构造函数,并通过外围实例

后者是很容易做到:

Constructor c = UserBuilder.class.getConstructor(UserOperationsUtility.class, String.class); 
return c.newInstance(this, (String)args[0]);