首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java中的反射动态实例化类失败

使用java中的反射动态实例化类失败
EN

Stack Overflow用户
提问于 2012-04-02 14:41:52
回答 2查看 3.7K关注 0票数 0

我有一段代码

代码语言:javascript
复制
List<Class<? extends SubApplication>> appClasses = new ArrayList<Class<? extends SubApplication>>();
List<SubApplication> subApps = new ArrayList<SubApplication>();

// instructions filling "appClasses"
// ... other instructions

for (Class<? extends SubApplication> crtClass : appClasses) {
    try {
        Constructor<? extends SubApplication> constructor = crtClass.getConstructor(new Class<?>[] { Application.class });
        SubApplication subApp = constructor.newInstance(this);
        if (!subApps.contains(subApp)) {
            subApps.add(subApp);
        }
    } catch (SecurityException e) {
    } catch (NoSuchMethodException e) {
    } catch (IllegalArgumentException e) {
    } catch (InstantiationException e) {
        System.out.println(e.getMessage());
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    }
}

thisApplication的一个实例。

我有几个SubApplication实现。该类的所有子类都需要实现一个以Application为参数的构造函数,这是约定的一部分。

现在,我总是收到一个InstanciationException,尽管我完全知道子类包含这样的构造函数。关于异常的详细信息不可用:getMessage()返回null

编辑: SubApplication是抽象的。但是appClasses只包含sub-classes of SubApplication

Edit2: --我不得不“构造”堆栈跟踪,因为根据约定,我必须捕获异常。

代码语言:javascript
复制
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
ch.migros.gmaare.tk.auth.gui.AuthenticableApp.instanciateSubApps(AuthenticableApp.java:64)
ch.migros.gmaare.tk.auth.gui.AuthenticableApp.<init>(AuthenticableApp.java:42)
ch.migros.gmaare.tk.voicesuite.VoicesuiteApplication.<init>(VoicesuiteApplication.java:34)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
com.vaadin.terminal.gwt.server.ApplicationServlet.getNewApplication(ApplicationServlet.java:82)
com.vaadin.terminal.gwt.server.AbstractApplicationServlet.createApplication(AbstractApplicationServlet.java:978)
com.vaadin.terminal.gwt.server.AbstractApplicationServlet.findApplicationInstance(AbstractApplicationServlet.java:801)
com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:456)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:662)

任何想法都会受到赞赏。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-21 18:25:39

如评论中所述。我愚蠢到无法验证数组中的类名。实际上,我真的把SubApplication添加到列表中了。无论如何,谢谢你的投入!

票数 0
EN

Stack Overflow用户

发布于 2012-04-02 16:01:05

当您尝试以下代码时:

代码语言:javascript
复制
import java.lang.reflect.Constructor;

public class Main {

    public static void main( final String[] args ) {
        final Class<? extends A>[] classes = new Class[] { B.class, C.class };
        for ( final Class<? extends A> clazz : classes ) {
            try {
                final Constructor<? extends A> constructor = clazz.getConstructor( null );
                final A a = constructor.newInstance( null );
            } catch ( final Exception e ) {
                e.printStackTrace();
            }
        }
    }

    public static abstract class A {

    }

    public static class B extends A {

    }

    public static abstract class C extends A {

    }
}

您将得到相同的错误:

代码语言:javascript
复制
java.lang.InstantiationException
    at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at Main.main(Main.java:10)

您可以将代码修改为:

代码语言:javascript
复制
if ( Modifier.isAbstract( clazz.getModifiers() ) ) {
    System.out.println( "skipping" );
} else {
    final A a = constructor.newInstance( null );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9978443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档