Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反射API-ClassNotFound异常_Java_Reflection_Classnotfoundexception - Fatal编程技术网

Java 反射API-ClassNotFound异常

Java 反射API-ClassNotFound异常,java,reflection,classnotfoundexception,Java,Reflection,Classnotfoundexception,场景:我在驱动器的文件夹中有java类。我想从一个特定的类调用一个方法,比如Regex。 我可以使用反射API调用方法吗?我有以下代码: File dir = new File("H:/TestFolder/sample"); File[] directoryListing = dir.listFiles(); if (directoryListing != null) { for (File child : directoryListing) {

场景:我在驱动器的文件夹中有java类。我想从一个特定的类调用一个方法,比如Regex。 我可以使用反射API调用方法吗?我有以下代码:

File dir = new File("H:/TestFolder/sample");
    File[] directoryListing = dir.listFiles();
    if (directoryListing != null) {
        for (File child : directoryListing) {
            File[] dirListing = child.listFiles();
            for (File fileName : dirListing) {
                if (fileName.getName().equals("Regex.java")) {
                    Class<?> clazz;
                    try {

                        clazz = Class.forName("Regex");
                        Constructor<?> ctor = clazz.getConstructor();
                        Object regexClass = ctor.newInstance();
....}
File dir=新文件(“H:/TestFolder/sample”);
File[]directoryListing=dir.listFiles();
if(directoryListing!=null){
用于(文件子项:目录列表){
File[]dirListing=child.listFiles();
用于(文件名:dirListing){
if(fileName.getName().equals(“Regex.java”)){
课堂讨论;
试一试{
clazz=Class.forName(“Regex”);
Constructor=clazz.getConstructor();
对象regexportss=ctor.newInstance();
....}

我得到ClassNotFoundException。有人能告诉我我做错了什么吗?

该类实际上被称为
[packageName]。Regex
,因为您在名为
[packageName]
的包中声明了它

Edit。Peter Lawrey指出,如果源代码是
H:/TestFolder/sample
,那么包必须是
sample
。因此该类将被称为
sample.Regex
,而不是
Regex
。这是假设基本包不是
TestFolder
。如果是,那么
TestFolder.sample.Reg我相信你明白了。请阅读劳瑞先生的评论

Class.forName()
获取指定包名的类名。对于
className
变量,从[]

className—所需类的完全限定名

这种特殊性应该采用
ClassNotFoundException


注意。我希望您的
Regex.java
已经编译成一个
Regex.class
文件。您的IDE应该这样做。

可能是一个愚蠢的问题,但是。您是否检查过这些类是否在类路径中

我的意思是。这个文件夹是你代码的src,还是你想检查和加载的外部文件夹


类应该位于类路径中,以便通过反射初始化它们的对象。

首先,不能从Java源文件加载类,必须对其进行编译。如果要从文件夹中加载已编译的类文件,请检查
Regex.class
是否位于默认包中的类路径中。@PeterLawrey先生,请不要这样做您不认为
Class.forName(…)中缺少的包名
是原因吗?我在回答部分提到了这一点。如果我错了,请纠正我。@PeterLawrey哦,是的。我错过了。我将更新答案。谢谢,先生。@PeterLawrey哦,是的。当然。请进行您认为必要的任何编辑。要知道它是哪一个包,请查看文件开头的
包xxx;
.java
文件。如果没有这样的行,它在默认包中。我没有包。它是JavaProject名称。它是示例(很抱歉输入了示例)。因此,您的文件顶部没有说明任何包,或者它被称为
sample
sample
?如果您在原始帖子中更新它会很好。Sidenote。如果您没有列出包,最好使用包,而不是使用
(默认包)
。是外部文件夹。你的意思是我不能检查并从外部文件夹加载?你可以检查。但这些文件将类似于文本平面文件:-)。没有类似于executsble类的文件。