java - 来自测试包的 Java 反射加载类
问题描述
我有这个结构:
│ build.gradle
└───src
├───main
│ └───java
│ Main.java
└───test
└───java
Test1.java
主.java:
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> testClass = Class.forName("test.Test1");
}
}
在 main 方法中,我想获取Test1
类的元数据,这些元数据放在测试包中。但是,我得到这个错误:
Exception in thread "main" java.lang.ClassNotFoundException: test.Test1
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:377)
at Main.main(Main.java:4)
如何访问测试包中的类?
解决方案
我相信这可能适用于 Gradle(至少版本 3.0 [岁] 或更高版本)。
Class<?> testClass = Thread.currentThread().getContextClassLoader()
.loadClass("test.Test1");
(我假设Test1
它在一个包中test
,而不是如图所示,在默认包中。)
当然,从生产代码访问测试代码是一个奇怪的设计选择。
推荐阅读
- node.js - node-sass:找不到命令
- c# - Win2D 的 CanvasControl 的文本在某些屏幕分辨率下会抖动
- r - 如果在 R 中满足两个条件,则删除所有 id
- mysql - 在sql中的单独列中显示重复的列并增加计数
- javascript - 在 Firefox 开发工具中像普通对象一样检查 Exception 对象
- pine-script - 之后传递的一系列数据如何评估?:
- c# - New-AzureADApplicationKeyCredential 是否对 CustomKeyIdentifier 和 Value 进行了双 base64 编码?
- google-cloud-platform - Terraform google_container_cluster 调整最大重试预算
- string - 在 pandas 数据框列中,如果是 2017 年,请删除最后 4 位数字
- flutter - Dart 中 DateTime.parse(data['datetime']) 的奇怪部分