场景:我在驱动器的文件夹中有java类。我想调用一个特定类的方法,比如Regex。 我可以使用Reflection 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();
....}
我得到了ClassNotFoundException。有人能告诉我我做错了什么吗?
答案 0 :(得分:1)
该类实际上称为[packageName].Regex
,因为您已在名为[packageName]
的某个包中声明了它。
修改即可。 Peter Lawrey指出,如果来源是H:/TestFolder/sample
,那么包裹必须是sample
。因此,该类将被称为sample.Regex
,而不是Regex
。这假设基础包不是TestFolder
。如果是,则TestFolder.sample.Regex
。我相信你明白了。请阅读Lawrey先生的评论below。
Class.forName()
获取指定包名称的类名。来自{className
变量的[docs],
className - 所需类的完全限定名称。
这种特异性应该取ClassNotFoundException
。
注意即可。我希望您的Regex.java
已编译为生成Regex.class
文件。你的IDE应该这样做。
答案 1 :(得分:0)
可能是一个愚蠢的问题但是。您是否检查过这些类是否在类路径中?
我的意思是。该文件夹是代码的 src ,还是要检查和加载的外部文件夹?类应该在类路径中,以便通过反射来初始化它们的对象。