Java 反射 java.lang.ClassNotFoundException。与查找 class 全名相关

Java reflection java.lang.ClassNotFoundException. Related to finding the full class name

我目前正在尝试开发一种调用特定 class 的方法。我遇到的问题是,当我调用 class.

时,我需要获取完全限定名称或完整 class 名称
public static void testAlgorithm(String className, String methodName, long n) throws Exception 
{
    Class<?> myClass = null;
    Object myObject = null;
    try {
        
        myClass = Class.forName(className);
        myObject = myClass.newInstance();
        
        Class<?>[] params = new Class[1];
        params[0]=Long.TYPE;
        
        Method m = myClass.getMethod(methodName, params);
        
        m.invoke(myObject, n);
    }catch(Throwable e) {
        System.err.println(e);
    }
}

我从main调用它

try {
    testAlgorithm("Algorithms", "linear", 50);      
    } catch (Exception e) {
        e.printStackTrace();
    }

我尝试为 className 传递不同的参数,我还直接修改了内部方法以尝试获取完整的 class 名称,但我没有得到任何工作。我在同一个项目文件 Session01 和同一个包 lab01.

中有 class

我也查了一个类似的问题here

这让我也尝试了:

Class currentClass = new Object() {}.getClass().getEnclosingClass();

算法内部 class 但我没有得到我需要用于我正在处理的方法的 java.lang.String

如果您只想调用给定 class 上的方法 - 您始终可以使用 .class 引用它,这样您就可以将方法的参数从 String className 更改为 Class<?> myClass 并简单地从方法的主体中删除 Class<?> myClass = null;

但是,如果您想保持方法的签名不变,并通过其简单名称而不是完全限定名称找到 class - 您也可以这样做。我可以建议使用 https://github.com/ronmamo/reflections 这会让事情变得容易得多。

然后您可以使用如下代码找到您的 class:

Set<Class<? extends Object>> classes = new Reflections("packageName").getSubTypesOf(Object.class);
Class<?> myClass = classes.stream().filter(clazz -> clazz.getSimpleName().equals(className))
                                   .findAny()
                                   .orElseThrow(() -> new IllegalArgumentException("No class with name: " + className));

请记住,您需要将 "packageName" 替换为要扫描 classes 的根包,这样只会找到此包或其子包中的 classes。包裹中的 class 越少 - 扫描速度越快,但您需要确保 class 会在包裹中。

另外请记住,您可以在不同的包中有多个同名的 classes - 此方法将用于其中任何一个。如果需要,您可以更改此行为。

您还可以将 classes 限制为比 Object.class.

更具体的 class 的子类型