当前位置: 首页 > 知识库问答 >
问题:

Java反射Java.lang.ClassNotFoundException。与查找完整类名相关的

赫连彬炳
2023-03-14

我目前正在尝试开发一个用于调用特定类的方法。我遇到的问题是,当我调用类时,我需要获得完全限定名或完整的类名。

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();
    }

我在这里也查到了一个类似的问题。

我也尝试了一下:

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

在算法类中,但我没有获得用于我正在使用的方法的java.lang.String

共有1个答案

利博远
2023-03-14

如果您只想在给定类上调用方法,那么您总是可以使用.class来引用它,这样您就可以将方法的参数从string classname更改为class myClass,并从方法体中删除class myClass=null;

但是,如果希望保持方法的签名原样,并通过简单名称而不是完全限定名称查找类,也可以这样做。我可以建议使用https://github.com/ronmamo/reflections,它使事情变得容易得多。

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

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”替换为根包,以便在根包中扫描类,以便只找到该包或其子包中的类。包中的类越少--扫描越快,但您需要确保您的类将在包中。

还要记住,您可以在不同的包中有多个同名的类--这个方法可以将它们中的任何一个都包含在内。如果需要,您可以改变这种行为。

您还可以将类限制为比object.class更具体的类的子类型。

 类似资料:
  • 我正在使用以下内容: 当它到达时,我得到以下异常: 的包是 那么,为什么会抛出那个错误呢?如果你需要更多的信息,请让我知道。谢了!

  • 这是关于cppreference的描述。com说 模板中使用的依赖名称的查找将推迟到模板参数已知时,此时[…]ADL检查从模板定义上下文或模板实例化上下文可见的具有外部链接的函数声明。 与此相反,以下代码段可以使用三个编译器(MSVC、clang、gcc)很好地编译: Foo是CallFoo中的从属名称:它取决于模板参数T。但是,尽管违反了上述两条规则,编译器还是找到了函数Foo。 从的定义或实例

  • 问题内容: 获取与映射中的最大值关联的键的最简单方法是什么? 我相信,当您想要对应于最大值的键时,Collections.max(someMap)将返回最大键。 问题答案: 基本上,你需要遍历地图的条目集,同时记住“当前已知的最大值”和与其关联的键。(当然,或者只是包含两者的条目。) 例如:

  • 我试图用流和映射将我的类的值与另一个类的值相加。 我的旧代码是这样的...

  • 问题内容: 我在Android 4.4及以下版本中遇到此问题。我已经集成了Google admob,当我运行该应用程序时,该应用程序崩溃,并显示ClassNotFoundException。 请在下面找到堆栈跟踪。 我尝试在Google上查找,但找不到此问题。要求社区对此提供帮助。 注意:请注意,我已经在Android Manifest中添加了移动广告元数据。 问题答案: 您收到此错误是因为您使用

  • 但是,如果我将依赖项添加到主HelloAR应用程序(按照自述文件中的说明),问题就解决了。 有人能解释一下是怎么回事,为什么我会出现错误,以及如何解决它而不需要添加依赖到主HelloAR应用程序吗?