【问题标题】:Dynamically create and read java classes动态创建和读取java类
【发布时间】:2016-03-22 15:02:04
【问题描述】:

我正在开发一个从 xsd 创建 Java 类的项目。在运行时,我想创建类并读取这些类的名称。但是,当我第一次运行项目时(在创建类之前),它给了我一个错误,上面写着 "java.lang.ClassNotFoundException: generated.classes.AddressType" 。如果我再次运行,而不更改任何内容(此时创建了类),它不会给我一个错误。我使用“com.sun.tools.xjc.api”来创建类。当我想读取类名时,我只需这样做

File folder = new File(System.getProperty("user.dir")+"\\src\\generated\\classes");
    File[] listOfFiles = null;
    List<String> namesOfClasses = new ArrayList<>();
    listOfFiles=folder.listFiles();
    for(File file: listOfFiles){
            try {
                    if(!file.getName().equals("ObjectFactory.java")){
                        String classname="generated.classes."+file.getName().substring(0, file.getName().length() - 5);
                        namesOfClasses.add(classname);
                    }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    return namesOfClasses;

看来,新创建的类在运行时是看不到的。如何让这些类在运行时读取?

【问题讨论】:

  • 我看不到共享代码如何抛出ClassNotFoundException。因为从目录中读取类名与类加载无关。
  • 这里是代码:http://pastebin.com/yeHkcMxq
  • 我的猜测 - 你的代码生成 .java 文件,我们需要 .class 来加载一个类。我猜您正在使用具有自动构建功能的 IDE,或者您的程序在下次运行时选择 class 文件的方式。

标签: java class xsd runtime xjc


【解决方案1】:

您可以像 (by answer) 一样即时编译您的类:

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, files);

请查看类似问题的其他替代方案:

我在测试我的xjc-documentation-annotation-plugin 时正是这样做的 :XJCPluginDescriptionAnnotationTest 可以作为分步教程使用。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 2016-10-24
    • 1970-01-01
    • 2011-04-16
    • 2010-11-14
    • 2021-05-02
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多