diff --git a/src/test/java/TestJarLoader.java b/src/test/java/TestJarLoader.java index 226ef7f5f984bd627a62c4ab358a99c967de27c7..8f8c32718d2215f24b216dd78714728ee506f617 100644 --- a/src/test/java/TestJarLoader.java +++ b/src/test/java/TestJarLoader.java @@ -15,5 +15,40 @@ public class TestJarLoader { ZipEntry zipEntry = jarFile1.getEntry("BOOT-INF/classes/cn/keepbx/jpom/common/interceptor/NotAuthorize.class"); System.out.println(zipEntry); String path = "D:\\Idea\\Jpom\\modules\\agent\\target\\agent-2.4.2.jar";//外部jar包的路径 - + Set> classes = new LinkedHashSet>();//所有的Class对象 + Map, Annotation[]> classAnnotationMap = new HashMap, Annotation[]>();//每个Class对象上的注释对象 + Map, Map> classMethodAnnoMap = new HashMap, Map>();//每个Class对象中每个方法上的注释对象 + try { + JarFile jarFile = new JarFile(new File(path)); + URL url = new URL("file:" + path); + ClassLoader loader = new URLClassLoader(new URL[]{url});//自己定义的classLoader类,把外部路径也加到load路径里,使系统去该路经load对象 + Enumeration es = jarFile.entries(); + while (es.hasMoreElements()) { + JarEntry jarEntry = es.nextElement(); + String name = jarEntry.getName(); + if (name != null && name.endsWith(".class")) { + System.out.println(name); + //只解析了.class文件,没有解析里面的jar包 + //默认去系统已经定义的路径查找对象,针对外部jar包不能用 + Class c = loader.loadClass(name.replace("/", ".").substring(0, name.length() - 6));//自己定义的loader路径可以找到 + System.out.println(c); + classes.add(c); + Annotation[] classAnnos = c.getDeclaredAnnotations(); + classAnnotationMap.put(c, classAnnos); + Method[] classMethods = c.getDeclaredMethods(); + Map methodAnnoMap = new HashMap(); + for (int i = 0; i < classMethods.length; i++) { + Annotation[] a = classMethods[i].getDeclaredAnnotations(); + methodAnnoMap.put(classMethods[i], a); + } + classMethodAnnoMap.put(c, methodAnnoMap); + } + } + System.out.println(classes.size()); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } }