Can you find all classes in a package using reflection?

前端 未结 27 2849
不知归路
不知归路 2020-11-21 05:24

Is it possible to find all classes or interfaces in a given package? (Quickly looking at e.g. Package, it would seem like no.)

27条回答
  •  轮回少年
    2020-11-21 05:49

    Based on @Staale's answer, and in an attempt not to rely on third party libraries, I would implement the File System approach by inspecting first package physical location with:

    import java.io.File;
    import java.io.FileFilter;
    import java.util.ArrayList;
    ...
    Class[] foundClasses = new Class[0];
    final ArrayList> foundClassesDyn = new ArrayList>();
    
    new java.io.File(
        klass.getResource(
            "/" + curPackage.replace( "." , "/")
        ).getFile()
    ).listFiles(
        new java.io.FileFilter() {
            public boolean accept(java.io.File file) {
                final String classExtension = ".class";
    
                if ( file.isFile()
                    && file.getName().endsWith(classExtension)
                    // avoid inner classes
                    && ! file.getName().contains("$") )
                {
                    try {
                        String className = file.getName();
                        className = className.substring(0, className.length() - classExtension.length());
                        foundClassesDyn.add( Class.forName( curPackage + "." + className ) );
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace(System.out);
                    }
                }
    
                return false;
            }
        }
    );
    
    foundClasses = foundClassesDyn.toArray(foundClasses);
    

提交回复
热议问题