首页 > 解决方案 > 来自测试包的 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)

如何访问测试包中的类?

更新: 在此处输入图像描述 在此处输入图像描述

标签: javagradlereflection

解决方案


我相信这可能适用于 Gradle(至少版本 3.0 [岁] 或更高版本)。

Class<?> testClass = Thread.currentThread().getContextClassLoader()
    .loadClass("test.Test1");

(我假设Test1它在一个包中test,而不是如图所示,在默认包中。)

当然,从生产代码访问测试代码是一个奇怪的设计选择。


推荐阅读