How to find the package name given a class name?

后端 未结 5 2076
我在风中等你
我在风中等你 2020-12-19 03:20

Given a class name as a string, how do I get the package name of it at run time ? I do not have the fully qualified name with package name + class name. Simply only the clas

5条回答
  •  盖世英雄少女心
    2020-12-19 03:44

    The only way would be to navigate the directories/jars in classpath and an entry with the class name.

    Here is some code that almost does what you want. This code is part of a class I have that searches for implementations/factory methods for creating instances of interfaces. Sorry, don't have the time to change this to look for a named class, should be an easy change, and as I mentioned elsewhere you don't need to load the class, just check the name.

    public Class locateImplementation(Class type) {
         Class c = null;
         String[] cp = System.getProperty("java.class.path").split(File.pathSeparator);
    
         for (int i = 0; (c == null) && (i < cp.length); ++i) {
             File f = new File(cp[i]);
             if (f.exists() && f.canRead()) {
                 if (isJar(f)) {
                     try {
                         c = searchJar(type, new FileInputStream(f));
                     } catch (Throwable t) {
                         // Nothing to worry about
                     }
                 } else {
                     c = searchFile(type, f);
                 }
             }
         }
    
         return c;
     }
    
    private boolean isClass(String path) {
        return path.matches(".+\\.class$") && !path.contains("$");
    }
    
    private Class searchFile(Class type, File f) {
        return searchFile(type, f, f.getPath());
    }
    
    private Class searchFile(Class type, File f, String root) {
        Class implementation = null;
    
        if (f.isDirectory()) {
            File[] files = f.listFiles();
            for (int i = 0; i < files.length; i++) {
                implementation = searchFile(type, files[i], root);
                if (implementation != null) {
                    break;
                }
            }
        } else if (isClass(f.getPath())) {
            String path = f.getPath().substring(root.length() + 1);
            Class c = getClass(path);
            if ((c != null) && !c.isInterface() &&
                    type.isAssignableFrom(c)) {
                implementation = c;
            }
        }
        return implementation;
    }
    
    private Class getClass(String name) {
        Class c;
        String className = name.replaceAll("[/\\\\]", ".")
            .replaceFirst("^\\.", "").replace(".class", "");
        try {
            c = Class.forName(className);
        } catch (Throwable e) {
            c = null;
        }
    
        return c;
    }
    
    
    private Class searchJar(Class type, InputStream in)
            throws Exception {
        ZipInputStream zin = new ZipInputStream(in);
        Class implementation = null;
    
        ZipEntry ze;
        while ((implementation == null)
                && ((ze = zin.getNextEntry()) != null)) {
            String name = ze.getName();
            if (name.endsWith("class")
                    && name.matches("^com.xxx.+")
                    && !name.contains("$")) {
                try {
                    Class c = getClass(name);
                    if ((c != null) && !c.isInterface()
                            && type.isAssignableFrom(c)) {
                        implementation = c;
                    }
                } catch (Throwable t) {
                    // Nothing to worry about
                }
            }
        }
    
        return implementation;
    }
    
    private boolean isJar(File f) {
        return f.getPath().endsWith(".jar");
    }
    

提交回复
热议问题