繁体   English   中英

获取类中的所有方法-容易出错

[英]Obtaining all the methods in a class — error prone

我是反射和练习的新手,我从网站上下载了一个随机Java项目。 我决定找出哪个类具有main方法,因此编写了以下代码:

package reflection;
import java.io.IOException;
import java.lang.reflect.*;
import java.nio.file.*;

public class FindMethods {
    public static void main(String[] args) throws IOException{
        if(args.length==0){
            System.out.println("Exiting");
            System.exit(1);
        }else{
            Path p = Paths.get(args[0]);
            DirectoryStream<Path> allClassFiles = Files.newDirectoryStream(p, "*.class");
            for(Path each : allClassFiles){
//              System.out.println(each.getFileName());
                try {
                    findMethods(each.getFileName().toString());
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void findMethods(String file) throws ClassNotFoundException{
        System.out.println(file);
        Class c = Class.forName(file);
        Method[] m = c.getDeclaredMethods();
        for(Method each : m){
            System.out.println(each.toString());
        }
    }
}  

System.out.println(each.getFileName()); 正确返回文件夹中的.class文件,但是它散布着ClassNotFoundException的堆栈跟踪

这些类如下:

Addwindow$1.class
Addwindow$2.class
Addwindow.class
Authorwindow.class
clsConnection.class
clsSettings$1.class
clsSettings.class
Deletewindow$1.class
Deletewindow$2.class
Deletewindow.class
Editwindow$1.class
Editwindow$2.class
Editwindow.class
Emprptwindow$PrintCommand.class
Emprptwindow.class
Helpwindow.class
LoginFrame$1.class
LoginFrame.class
MainMenu$1.class
MainMenu$2.class
MainMenu.class
Payrptwindow.class
printwindow$1.class
printwindow.class
Settingswindow$1.class
Settingswindow.class  

为了从每个类获取方法,我需要对代码进行哪些更改?

堆栈跟踪:

java.lang.ClassNotFoundException: Settingswindow
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at reflection.FindMethods.findMethods(FindMethods.java:33)
    at reflection.FindMethods.main(FindMethods.java:22)  

讨论的随机项目:

http://projectseminar.org/java-projects/payroll-accounting-system/98/

.class是文件名的一部分,但不是类名的一部分。 您需要先剥离它,然后再将其传递给Class.forName

另一个问题是forName期望使用句点来分隔软件包,而不是使用斜线或文件系统使用的任何目录分隔符。 如果一切都在默认软件包中,那么这应该不是问题。

如果仍然无法正常工作,则应仔细检查类路径。

包含$类名称是外部类中的匿名类(由$左侧的名称确定)。 您可以放心地在搜索main忽略它们。 只需在主循环中的类名中测试$的存在,然后跳过处理即可。

在不了解更多信息的情况下,我无法说出为什么您的代码找不到其他一些类(例如clsConnection )。

这种方法存在一个问题-加载所有项目的类。 最好在不加载类的情况下对其进行分析。 有用于此的工具。 这是我们可以使用http://www.jboss.org/javassist进行的操作

public static void findMethods(String file) throws Exception {
    ClassPool cp = ClassPool.getDefault();
    try (InputStream is = new FileInputStream(file)) {
        CtClass cc = cp.makeClass(is);
        for (CtMethod m : cc.getMethods()) {
            System.out.println(m);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM