您的位置:首页 > 编程语言 > Java开发

java反射查看jar包中所有的类名方法名

2017-03-17 15:43 148 查看
不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码:

1 import java.lang.reflect.Field;
2 import java.lang.reflect.Method;
3 import java.net.URL;
4 import java.net.URLClassLoader;
5 import java.util.Enumeration;
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.jar.JarEntry;
10 import java.util.jar.JarFile;
11
12
13
14 public class JarUtil extends URLClassLoader {
15     /**
16      * 这些默认方法不打印
17      */
18     private static String DEFAULT_METHOD = "waitequalsnotifynotifyAlltoStringhashCodegetClass";
19
20     public JarUtil(URL url) {
21         super(new URL[] { url });
22     }
23
24     /**
25      * 获取jar中某个class
26      *
27      * @param jarPath
28      * @param classPath
29      * @return
30      */
31     @SuppressWarnings({ "rawtypes", "resource" })
32     public static Object getClassObject(String jarPath) {
33         try {
34             if(jarPath.indexOf("file:///")<0){
35                 jarPath = "file:///"+jarPath;
36             }
37             URL url = new URL(jarPath);
38             JarUtil t = new JarUtil(url);
39             Map<String,List<String>> rtnList = new HashMap<String,List<String>>();
40            //通过jarFile和JarEntry得到所有的类
41             JarFile jar = new JarFile(jarPath.replace("file:///",""));
42             //返回zip文件条目的枚举
43             Enumeration<JarEntry> enumFiles = jar.entries();
44             JarEntry entry;
45
46             //测试此枚举是否包含更多的元素
47             while(enumFiles.hasMoreElements()){
48                 entry = (JarEntry)enumFiles.nextElement();
49                 if(entry.getName().indexOf("META-INF")<0 && entry.getName().indexOf("eclipse")<0 && entry.getName().indexOf(".class")>=0){
50                     String classFullName = entry.getName();
51                     //去掉后缀.class
52                     String className = classFullName.substring(0,classFullName.length()-6).replace("/", ".");
53                     System.out.println("~~~~~~~~~~~~~~~Class名称:" + className);
54
55                     Class c ;
56                     try {
57                         c= t.findClass(className);
58                     } catch (LinkageError e) {
59                         c =   Class.forName(className);
60                     }
61
62                   //根据class对象获得属性
63                   Field[] fields = c.getDeclaredFields();
64                   for(Field f1 : fields){
65                       //打印每个属性的类型
66                       System.out.println("~~~~~~~~~~~~~~~属性类型:" + f1.getType());
67                       //打印每个属性的名字
68                       System.out.println("~~~~~~~~~~~~~~~属性名称:" + f1.getName());
69                   }
70                   //通过getMethod得到类中包含的方法
71                   Method methods[] = c.getMethods();
72                   for (Method method : methods) {
73                       String sm = method.getName();
74                     //打印除默认方法外的方法
75                     if(DEFAULT_METHOD.indexOf(sm)<0){
76                          System.out.println("方法名:" + sm);
77                     }
78
79                   }
80
81                 }
82             }
83
84         } catch (Exception ex) {
85             ex.printStackTrace();
86         }
87         return null;
88     }
89
90     public static void main(String[] args) throws Exception {
91
92         getClassObject("file:///C:\\Users\\zhang\\Desktop\\testrobot.jar");
93     }
94 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: