现在已经知道一个package名,我想知道这个包下的所有类名,请问怎么获取?最好带上代码。我查过java
 rtti的所有相关函数,没有这样的东西。

解决方案 »

  1.   

    前些天有个朋友问了类似的问题我帮他写了一段代码,你看看符合你的要求吗String packageName = "java.lang";  换成你设定的包名///////////////////////////////////////////////////////import java.io.File;
    import java.io.FileInputStream;
    import java.io.FilenameFilter;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;/**
     * 
     * @author ronny_zeng
     * 
     */
    public class SearchClass {
    public static void main(String[] args) throws Exception {
    String classpath = System.getProperty("java.class.path");
    String[] all = classpath.split(";");String packageName = "java.lang";for(int i = 0;i<all.length;i++) {
    if(all[i].endsWith(".jar")) {
    findJar(all[i],packageName );
    } else {
    findFile(all[i],packageName );
    }}
    }/**
     * 
     * @param path
     * @param packName
     * @throws Exception
     */
    public static void findFile(String path, String packName) throws Exception {
    File file = new File(path + "\\" + packName.replace('.', '\\'));System.out.println(file.getAbsolutePath());
    if (file.exists() && file.isDirectory()) {File[] classes = file.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
    if (name.endsWith(".class")) {
    System.out.println(name);
    return true;
    }
    return false;
    }
    });
    System.out.println(classes.length);
    }
    }/**
     * 
     */
    public static void findJar(String jar ,String packName) throws Exception {
    ZipInputStream in = new ZipInputStream(new FileInputStream(
    new File(jar)));
    ZipEntry ze = null;while ((ze = in.getNextEntry()) != null) {
    if(ze.getName().startsWith(packName.replace(".","/"))&&ze.getName().endsWith(".class")&&(ze.getName().lastIndexOf("/")==(packName.replace(".","/")+"/").lastIndexOf("/"))) {
    System.out.println(ze.getName());
    }
    }
    }}
      

  2.   


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FilenameFilter;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    /**
     * 
     * @author ronny_zeng
     * 
     */
    public class SearchClass {
    public static void main(String[] args) throws Exception {
    String classpath = System.getProperty("java.class.path");
    String[] all = classpath.split(";");
            
    String pack = "javax.swing"; long begin = System.currentTimeMillis(); for (int i = 0; i < all.length; i++) {
    all[i].trim();
    if (all[i].endsWith(".jar")) {
    findJar(all[i], pack);
    } else {
    findFile(all[i], pack);
    }
    } // for
    findJar(System.getProperty("java.home")+"\\lib\\rt.jar", pack);
    System.out.println(" \nTotal Time : "
    + (System.currentTimeMillis() - begin) + " ms");
    } /**
     * find class in flat file 
     * @param path
     * @param packName
     * @throws Exception
     */
    public static void findFile(String path, String packName) throws Exception {
    File file = new File(path + "\\" + packName.replace('.', '\\'));
    if (file.exists() && file.isDirectory()) {
    File[] classes = file.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
    if (name.endsWith(".class")) {
    System.out.println(name);
    return true;
    }
    return false;
    }
    });
    System.out.println(classes.length);
    }
    }
    /**
     * find class in jar 
     * @param jar
     * @param packName
     * @throws Exception
     */
    public static void findJar(String jar, String packName) throws Exception {
    ZipInputStream in = new ZipInputStream(new FileInputStream(
    new File(jar)));
    ZipEntry ze = null; while ((ze = in.getNextEntry()) != null) {
    if (ze.getName().startsWith(packName.replace(".", "/"))
    && ze.getName().endsWith(".class")
    && (ze.getName().lastIndexOf("/") == (packName.replace(".",
    "/") + "/").lastIndexOf("/"))) {
    System.out.println(ze.getName());
    }
    }
    }
    }
    改进了一下
      

  3.   

    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    return loader.getResource(packageResource).getFile().replaceAll("%20", " ");
      

  4.   

    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.FilterInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.sql.Array;
    import java.util.ArrayList;import javax.imageio.ImageIO;
    public class FileUtil
    {
    /**
     * read ascii file
     * */
    public static StringBuffer readFile(String filename)
    {
    try
    {
    FileReader fr = new FileReader(filename);
    BufferedReader br = new BufferedReader(fr);
    StringBuffer recordBuf = new StringBuffer();
    String record = null;
    while ((record = br.readLine()) != null)
    {
    recordBuf.append(record + "\n");
    }
    br.close();
    fr.close(); return recordBuf;
    }
    catch (Exception ex)
    {
    Log.debug("FileUtil.readFile(): " + ex.toString());
    } return null;
    } /**
     * read byte file
     * */
    public static byte[] readByteFile(String filename)
    {
    try
    {
    File file = new File(filename);
    byte[] data = new byte[(int) file.length()];
    FileInputStream fis = new FileInputStream(file);
    fis.read(data);
    fis.close(); return data;
    }
    catch (Exception ex)
    {
    Log.debug("FileUtil.readByteFile(): " + ex.toString());
    } return null;
    } /**
     * read byte file
     * */
    public static BufferedImage readImageFile(String filename)
    {
    try
    {
    return ImageIO.read(new File(filename));
    }
    catch (IOException ex)
    {
    Log.debug("FileUtil.readImageFile(): " + ex.toString());
    } return null;
    } /**
     * read package resource
     * */
    public static StringBuffer readPackageResource(String packageResource)
    {
    if (packageResource == null)
    return null; try
    {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    InputStream is = loader.getResourceAsStream(packageResource);
    BufferedReader bf = new BufferedReader(new InputStreamReader(is));
    StringBuffer recordBuf = new StringBuffer();
    String record = null;
    while ((record = bf.readLine()) != null)
    {
    recordBuf.append(record + "\n");
    }
    bf.close();
    is.close(); return recordBuf;
    }
    catch (Exception ex)
    {
    Log.debug("readPackageResource(): " + ex.toString());
    ex.printStackTrace();
    } return null;
    } /**
     * read package resource
     * */
    public static byte[] readPackageByteResource(String packageResource)
    {
    if (packageResource == null)
    return null; try
    {
    //get data length
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    InputStream is = loader.getResourceAsStream(packageResource);
    int length = 0;
    while (is.read() != -1)
    {
    length++;
    }
    is.close(); //read data
    byte[] data = new byte[length];
    is = loader.getResourceAsStream(packageResource);
    is.read(data);
    is.close(); return data;
    }
    catch (Exception ex)
    {
    Log.debug("readPackageResource(): " + ex.toString());
    ex.printStackTrace();
    } return null;
    } /**
     * read package resource
     * */
    public static BufferedImage readPackageImageResource(String packageResource)
    {
    if (packageResource == null)
    return null; try
    {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    return ImageIO.read(loader.getResource(packageResource));
    }
    catch (IOException ex)
    {
    Log.debug("FileUtil.readPackageImageResource(): " + ex.toString());
    } return null;
    } /**
     * get resource file path in package
     * @param packageResource package resource relative path
     * @return String package resource file path
     * */
    public static String getPackageResourcePath(String packageResource)
    {
    if (packageResource == null)
    return null; if (packageResource.startsWith("\\") || packageResource.startsWith("/"))
    packageResource = packageResource.substring(1); if (packageResource.endsWith("\\") || packageResource.endsWith("/"))
    packageResource = packageResource.substring(0, packageResource.length() - 1); ClassLoader loader = Thread.currentThread().getContextClassLoader();
    return loader.getResource(packageResource).getFile().replaceAll("%20", " ");
    } /**
     * get resource file path in package
     * @param packageResource package resource relative path
     * @return String package resource file path
     * */
    public static URL getPackageResourceUrl(String packageResource)
    {
    if (packageResource == null)
    return null; ClassLoader loader = Thread.currentThread().getContextClassLoader();
    return loader.getResource(packageResource);
    } public static void main(String[] args)
    {
    System.out.println(FileUtil.getPackageResourceUrl("META-INF/config.xml"));
    }
    }
      

  5.   

    interpb(曾曾胡,深怕情多累美人!!!) 的代码在tomcat无效了。
    我觉得还是从classloader入手比较好。