2016-04-03 63 views
1

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

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

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

+0

首先,不能从Java源文件加载必须编译的类。如果你想从一个文件夹加载编译的类文件,请检查[this](http://stackoverflow.com/questions/6219829/method-to-dynamically-load-java-class-files) –

+0

我会检查'正则表达式。 class'在默认包中的类路径中。 –

+0

@PeterLawrey先生,你不觉得在'Class.forName(..)'中丢失的包名引起了这个问题吗?我在回答部分提到了这一点。如果我错了,请纠正我。 –

回答

1

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

编辑。彼得劳里指出,如果来源是H:/TestFolder/sample该软件包必须是sample。所以这个班级将被称为sample.Regex,而不是Regex。这是假定基础包不是TestFolder。如果是,那么TestFolder.sample.Regex。我相信你明白了。请阅读Lawrey先生的评论below

Class.forName()取一个指定包名的类名。从[docs]为className变量,

className - 所需类的完全限定名称。

这种特异性应采取的ClassNotFoundException

注意。我期待您的Regex.java已编译生成Regex.class文件。你的IDE应该做到这一点。

+0

要知道它是哪个包,请查看'.java'文件开头处的'package xxx;'行。如果没有这样的行,它是在默认包中。 –

+0

我没有包装。这是JavaProject的名称。它是样本(对于错字样本抱歉)。 – MadxG

+0

那么,你的文件的顶部没有声明包,还是叫做'sample'或'Sample'?如果你在原始文章中更新它会很好。 **边注**。如果您没有列出软件包,最好有一个软件包,而不是使用'(默认软件包)'。 –

0

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

我是说。该文件夹是您的代码的src或者它是您要检查并加载的外部文件夹?

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

+0

它是外部文件夹。所以你的意思是我无法检查并从外部文件夹加载? – MadxG

+0

你可以检查。但是这些文件将会像文本平面文件一样:-)。不喜欢可执行的类。 – Laiv