在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ Java怎么獲取相對路徑下所有的.java文件的信息

Java怎么獲取相對路徑下所有的.java文件的信息

目前是我想寫個簡單的mvc框架,目前的思路是,讀取yaml配置文件,然后配置controller的相對路徑:

server:
  port: 9000

application:
  controllerPath: com.wy.evolution.framework.controller

現(xiàn)在是拿到了這個controllerPath,然后我想通過這個相對路徑+反射得到所有的.java文件的信息,這樣我就可以根據(jù)注解來處理請求了,框架是基于netty寫的,現(xiàn)在才剛起步。

請問有啥比較簡單的辦法嗎?

回答
編輯回答
心沉

你確定是 .java 文件的信息?跑起來的時候都是 .class 啊。

如果你說的是根據(jù)這個類名讀取注解什么的,那直接

Class clazz = Class.forName(CONTROLLER_PATH);

前提是那個包有進 PATH。

如果真的要先從簡單的做起,那么可以先把所有配置做成注解,后期再加入外部文件的配置支持。

2018年8月28日 23:12
編輯回答
菊外人

理論上不能,因為java可能動態(tài)創(chuàng)建并加載類.
實踐上是可能, 假設(shè)你不動態(tài)創(chuàng)建類, 或動態(tài)創(chuàng)建也由你的ClassLoader來處理,或可能忽略那些不是你創(chuàng)建的類

  1. 用Guava反射的方式:
 Reflections reflections = new Reflections("com.wy.evolution.framework.controller");

 Set<Class<? extends Object>> allClasses = 
     reflections.getSubTypesOf(Object.class);
   
//或者用
 ClassPath.getTopLevelClasses(String packageName)
  1. 掃描classpath的方式:
/**
 * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
 *
 * @param packageName The base package
 * @return The classes
 * @throws ClassNotFoundException
 * @throws IOException
 */
private static Class[] getClasses(String packageName)
        throws ClassNotFoundException, IOException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    assert classLoader != null;
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = classLoader.getResources(path);
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        dirs.add(new File(resource.getFile()));
    }
    ArrayList<Class> classes = new ArrayList<Class>();
    for (File directory : dirs) {
        classes.addAll(findClasses(directory, packageName));
    }
    return classes.toArray(new Class[classes.size()]);
}

/**
 * Recursive method used to find all classes in a given directory and subdirs.
 *
 * @param directory   The base directory
 * @param packageName The package name for classes found inside the base directory
 * @return The classes
 * @throws ClassNotFoundException
 */
private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
    List<Class> classes = new ArrayList<Class>();
    if (!directory.exists()) {
        return classes;
    }
    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file, packageName + "." + file.getName()));
        } else if (file.getName().endsWith(".class")) {
            classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
        }
    }
    return classes;
}

參考:
https://stackoverflow.com/que...

2017年3月22日 03:57