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

2023-11-21

我将类名存储在属性文件中。我知道类存储将实现 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.tools API。这仅需要JDK安装在本地计算机上的 JRE 之上。

这是一个基本的启动示例(将明显的异常处理放在一边):

// 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 = Files.createTempDirectory("java").toFile();
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.getDeclaredConstructor().newInstance(); // Should print "world".
System.out.println(instance); // Should print "test.Test@hashcode".

其产量如下

hello
world
test.Test@cafebabe

如果这些类进一步使用会更容易implements已经在类路径中的某个接口。

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

否则你需要让反射API访问和调用(未知)方法/字段。


这就是说,与实际问题无关:

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

Letting java.io.File依赖当前工作目录会带来可移植性问题。不要那样做。将该文件放入类路径并使用ClassLoader#getResourceAsStream()具有类路径相对路径。

properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ClassName.properties"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式编译和实例化 Java 类? 的相关文章

  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • 如何在 Java 中访问嵌套的 HashMap?

    我有一个 Java 中的 HashMap 其中的内容 你们可能都知道 可以通过以下方式访问 HashMap get keyname 如果一个 HashMap 位于另一个 HashMap 中 即嵌套的 HashMap 我将如何访问内容 我可以
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • Java 读取大文本文件时出现 OutOfMemoryError

    我是 Java 新手 正在读取非常大的文件 需要一些帮助来理解问题并解决它 我们有一些遗留代码 必须对其进行优化才能正常运行 文件大小仅在 10mb 到 10gb 之间变化 只有当文件开始大小超过 800mb 时才会出现启动问题 Input
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • Java:线程“主”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:

    我是初学者 谁能帮我弄清楚我们在做什么 我正在尝试读取字符串并将字符串的每个字符存储在数组中 import java util Scanner public class CoreMainDigitExtractor static Scann
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • maven 无法下载 jacoco 0.7.10-SNAPSHOT jar

    我对此感到困惑 我的 pom xml 中有这个
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外

随机推荐

  • Laravel 对所有页面进行身份验证检查

    我已经创建了身份验证 并且它运行良好 但检查内页时存在一些问题 例如 Route get array before gt auth do gt function return View make home index 索引页面仅对登录用户可
  • 从手机号码中提取国家代码

    我有一个带有国家 地区代码的手机号码列表 例如 919638095998 号码 我已经提到了libphonenumber 谷歌示例另外 首先我们需要传递国家 地区 2 位数代码 我最初不知道 那么我怎么知道这个号码来自哪个国家呢 我还得到了
  • CouchDB读取授权

    在couchdb网站 gt 技术概述 gt 安全性和验证 http couchdb apache org docs overview html 它写道 在读者访问 部分 为了保护文档内容 CouchDB文档可以有一个读者列表 这是允许阅读文
  • Angular ui-router 完成条件视图

    我正在问一个与这个问题类似的问题 UI 路由器条件 ui 视图 但我的情况有点复杂 我似乎无法得到所提供的工作答案 基本上 我有一个 url 可以用两种截然不同的方式呈现 具体取决于 url 指向的实体类型 这是我目前正在尝试的 state
  • 鼠标中键按下并移动事件

    是什么控制事件鼠标中键按下并移动 也就是说 当我按住鼠标中键并移动鼠标时 我可以订阅什么事件 看一下 Control MouseDown 事件 鼠标按钮枚举 在 C 中检测鼠标按钮事件 你也可以尝试这样的事情 private void Fo
  • 使用 Redis 的 Mule 缓存策略

    我正在寻找一种在两台服务器之间共享缓存的方法 并且正在研究使用 Redis 作为对象存储缓存策略 但在读取存储值时遇到问题 当缓存命中为未命中值时 它会成功存储值 但在检索该值时会抛出错误 所需的对象 属性 muleContext 为 nu
  • 如何在 ext 4 中制作完整的模式窗口?

    就像微软操作系统 xp vista 7 等 中的窗口一样 如果主窗口创建模态窗口 则用户无法访问主窗口 包括关闭和访问工具栏等 我想用 extjs 做一个类似的 这是我的模态示例 Ext create Ext Window title aa
  • 类型存在于 2 个程序集中

    我从两个不同的第三方 COM DLL 创建了两个 NET Interop 程序集 这两个 COM DLL 都包含一个名为COMMONTYPE 所以 COMMONTYPE现在也通过两个互操作程序集公开 我有第三个项目需要使用这两个互操作程序集
  • jce 无法验证提供者 bc

    我开发了一个应用程序 在 BountyCastle jar 的帮助下使用了密码学 我还有一行 Security addProvider new org bouncycastle jce provider BouncyCastleProvid
  • 在两个无序字符向量之间执行非成对的全部比较 --- intersect 的相反 --- 全部到全部 setdiff

    示例数据 v1 lt c E82391 X2329323 C239923 E1211 N23932 F93249232 X93201 X9023111 O92311 9000F K9232932 L9232932 X02311111 v2
  • Object类如何实现clone()方法

    在一本关于 Core Java 的书中 我发现了这样的摘录 想想以何种方式 对象类可以实现克隆 它 对物体一无所知 所以它只能逐个字段 复制 如果对象中的所有数据字段 是数字或其他基本类型 复制字段就可以了 但 如果该对象包含对 子对象 然
  • 在调用超类构造函数之前验证构造函数的参数

    例如 这样的构造函数 public class Car extends Vehicle public Car Car a super a getName what if a is null 在调用 super 之前我无法检查参数的条件 在这
  • 用自定义的任务计划程序替换 C# 中的任务计划程序

    我想知道是否可以使用 C 更改将任务映射到 NET 中真实操作系统线程的任务调度程序 或者是否需要重新编译 Mono 运行时来执行此操作 谢谢 系统 线程 任务 如果您参考系统 线程 任务那么你需要的是子类化任务调度器然后你可以使用你的类的
  • 参数类型“customClass.Type”不符合预期类型“NSItemProviderWriting”

    iOS 11 x 斯威夫特 4 尝试实现自定义类以使用新的拖放协议 并且需要一些超级编码器的帮助 我创建了这个类 import UIKit import MobileCoreServices class CustomClass NSObje
  • PHP 的 mail():有哪些需要注意的潜在问题?

    给定接受自定义用户输入 例如地址 主题行 消息 的联系表单 需要注意哪些安全隐患和 陷阱 至少 必须验证用户的电子邮件地址 可能使用 filter var 或等效函数 根据我的阅读 这还应该防止将额外的标头注入到脚本中 那么主题行和消息内容
  • angular-cli工具的--base-href和--deploy-url参数有什么区别

    Angular 的文档告诉我们应该使用 base href当要部署在子文件夹中时 Angular 应用程序构建用于生产时的参数 如果将文件复制到服务器子文件夹中 请附加构建标志 base href并设置适当地 例如 如果index html
  • golang 中 C++ 的“using”等价物是什么

    什么是C using some namespace objectgolang 中的等价物 根据问题here我可以得到using namespace common附有以下声明 import common 但这会导入整个命名空间 现在我只想使用
  • force_ssl 在 Rails 中做什么?

    在之前的一个question我发现我应该设置 nginx ssl 终止并且不让 Rails 处理加密数据 那么为什么会出现下面的情况呢 config force ssl true 我在生产配置文件中看到这一点被注释掉了 但是 如果期望 ng
  • PyInstaller 打包的应用程序在控制台模式下工作正常,在窗口模式下崩溃

    我正在使用 Python 和 PySide 构建一个相当复杂的应用程序 发布的日子终于临近了 所以我想将此应用程序构建为 exe 然而 我手上有一个奇怪的问题 我过去使用过 PyInstaller 顺便说一下 使用版本 2 但从未发生过这种
  • 如何以编程方式编译和实例化 Java 类?

    我将类名存储在属性文件中 我知道类存储将实现 IDynamicLoad 如何动态实例化该类 现在我有 Properties foo new Properties foo load new FileInputStream new File C