在Java中,是否可以知道是否已加载类?

2022-08-31 23:58:46

是否有可能知道 Java 类是否已加载,而无需尝试加载它? 尝试加载类,但我不希望出现这种副作用。还有别的方法吗?Class.forName

(我不想重写类装入器。我正在寻找一种相对简单的方法。


答案 1

(感谢阿列克西)此代码:

public class TestLoaded {
     public static void main(String[] args) throws Exception {
          java.lang.reflect.Method m = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
          m.setAccessible(true);
          ClassLoader cl = ClassLoader.getSystemClassLoader();
          Object test1 = m.invoke(cl, "TestLoaded$ClassToTest");
          System.out.println(test1 != null);
          ClassToTest.reportLoaded();
          Object test2 = m.invoke(cl, "TestLoaded$ClassToTest");
          System.out.println(test2 != null);
     }
     static class ClassToTest {
          static {
               System.out.println("Loading " + ClassToTest.class.getName());
          }
          static void reportLoaded() {
               System.out.println("Loaded");
          }
     }
}

生产:

false
Loading TestLoaded$ClassToTest
Loaded
true

请注意,示例类不在包中。完整的二进制名称是必需的。

二进制名称的一个示例是"java.security.KeyStore$Builder$FileBuilder$1"


答案 2

您可以在类加载器中使用 findLoadedClass(String) 方法。如果未装入类,则返回 null。


推荐