我正在制作一个应用程序,该应用程序运行具有@Window批注的类中的所有方法,但现在我已经有了:
Class<App> obj = App.class;
Object t = null;
try {
t = obj.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
if (obj.isAnnotationPresent(Window.class)) {
for (Method method : obj.getMethods()) {
if (method.isAnnotationPresent(Window.Run.class)) {
try {
method.invoke(t, new Object[] {});
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
}
但是它只有在我知道类名的情况下才有效。如何在没有外部API的情况下检测项目中的所有类?
答案 0 :(得分:0)
So yes it was difficult but i did it without any API
private static List<Class<?>> findClasses(File directory, String packageName) {
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.equals("") ? packageName + "." : packageName) + file.getName()));
} else if (file.getName().endsWith(".class"))
try {
classes.add(Class
.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
} catch (ClassNotFoundException e) {
System.err.println(e.getMessage());
}
}
return classes;
}
this returns all classes inside a package like TREE command in CMD (if you insert "" as packagne name this will return all classes inside the project).
public static Class<?>[] getClasses(String packageName) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = null;
try {
resources = classLoader.getResources(path);
} catch (IOException e) {
System.err.println(e.getMessage());
}
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
List<Class<?>> classes = new ArrayList<Class<?>>();
for (File directory : dirs)
classes.addAll(findClasses(directory, packageName));
return classes.toArray(new Class[classes.size()]);
}
then this method extract all classes from a package using findClasses() method.
答案 1 :(得分:-1)
我认为没有一种简单的方法可以做到这一点,或者即使创建自己的自定义实现值得这样做。
我不明白为什么您不希望使用外部依赖项来这样做。几个月前,我遇到了同样的问题,我只是选择使用反射API来完成我的工作。您可以在这里查看更多信息:https://github.com/ronmamo/reflections。
此外,您还可以考虑创建一个实用程序,该实用程序将扫描项目的各个程序包,以查找带有该注释的类和方法,但是如前所述,这将使您创建类似于上面提到的库。
除此之外,您可能会研究注释后处理器(即创建自己的注释器),但是我没有尝试过这种方法,也无法告诉您是否符合您的要求。
最重要的是,除非有非常严格的需求表明您不能使用第三方库,否则我看不出有任何理由需要您重新发明轮子。