当前位置: 首页 > 面试题库 >

如何以编程方式编译和实例化Java类?

庄欣然
2023-03-14
问题内容

我将类名称存储在属性文件中。我知道类存储将实现IDynamicLoad。如何动态实例化该类?

现在我有

     Properties foo = new Properties();
    foo.load(new FileInputStream(new File("ClassName.properties")));
    String class_name = foo.getProperty("class","DefaultClass");
    //IDynamicLoad newClass = Class.forName(class_name).newInstance();

newInstance是否仅加载编译的.class文件?如何加载未编译的Java类?


问题答案:

如何加载未编译的Java类?

你需要先编译它。可以使用javax.toolsAPI以编程方式完成此操作。这仅需要在JRE顶部的本地计算机上安装JDK。

这是一个基本的启动示例(不包括明显的异常处理):

// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";

// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));

// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());

// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
Object instance = cls.newInstance(); // Should print "world".
System.out.println(instance); // Should print "test.Test@hashcode".

哪个像

hello
world
test.Test@ab853b

如果这些类implements对已经在类路径中的某个接口进行分类,则进一步使用将更加容易。

SomeInterface instance = (SomeInterface) cls.newInstance();

否则,你需要使用Reflection API来访问和调用(未知)方法/字段。

话虽如此,但与实际问题无关:

properties.load(new FileInputStream(new File("ClassName.properties")));

让java.io.File依赖当前的工作目录是可移植性问题的解决方案。不要那样做 将该文件放在类路径中,并ClassLoader#getResourceAsStream() 与类路径相对路径一起使用。

properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ClassName.properties"));


 类似资料:
  • 问题内容: 您是否知道JavaScript的“ JSON Beautifier”? 从 至 例 问题答案: 程序格式化解决方案: 许多现代浏览器(包括IE8)支持的方法可以输出美化的JSON字符串: 此方法还包含在json2.js中,用于支持较旧的浏览器。 手动格式化解决方案 如果您不需要以编程方式进行操作,请尝试JSON Lint 。它不仅会美化您的JSON,还将同时对其进行验证。

  • 我想创建一个程序,可以编译一个.java文件到一个.class文件,就像在这个网站上做的:创新网站 null

  • 我有许多Java bean接口,如下所示: 我还自动生成bean实现如下: ObjectMapper完美工作,除了当我开始像这样嵌套这些bean时: 我得到这个错误: 抽象类型需要映射到具体类型、具有自定义反序列化器或包含其他类型信息 它在抱怨,因为bean定义是一个接口,而不是具体类型。我的问题是,是否有一种方法可以让我通过模块或其他东西为ObjectMapper定义接口类型到具体类型的映射?

  • 问题内容: 我目前正在从事一个项目,该项目要求我以编程方式将.class文件反编译为Java文件。IE我有一个程序,应该读取一个类文件并对其进行反编译,并将生成的Java源代码写入文件中。请帮我做。 编辑:我是反编译器世界的全新手。我已经看过一些API,但是我不知道到底该如何使用以及使用哪个API。任何形式的帮助将是非常可观的 编辑: 我尝试使用: 但是上面的代码只是在指定的目录中创建了一个名为“

  • 摘要 这个问题是关于在几个不同的翻译单元中实现单个模板类实例化的单独编译。 文件A2.cpp: 现在我尝试用模板类做类似的事情。因为我确切地知道我将需要哪些实例,所以我显式地实例化模板。我单独编译每个实例化,因为成员函数包含相当大的数学表达式,这可能会在高优化级别上大大降低编译器的速度。所以我尝试了以下方法: 文件ta.h: 这是否意味着即使使用显式实例化也不可能(不允许)单独编译模板类(隐式实例

  • 问题内容: 如何使用Java中的aws-sdk以编程方式启动和停止Amazon EC2实例? 非常感谢您的帮助,因为我花了一天的时间来解决这个问题。 问题答案: 我最近已经在Bamboo AWS插件中 实现了此功能;它是开源的,代码可在Bitbucket上找到,您可以找到一个完整的示例如何在EC2Task.java中启动/停止/重启实例(a,实际上应该是一个单独的类)。 幸运的是,这一点都不复杂,