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

时间:2024-01-04 22:28:08

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

 import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile; public class JarUtil extends URLClassLoader {
/**
* 这些默认方法不打印
*/
private static String DEFAULT_METHOD = "waitequalsnotifynotifyAlltoStringhashCodegetClass"; public JarUtil(URL url) {
super(new URL[] { url });
} /**
* 获取jar中某个class
*
* @param jarPath
* @param classPath
* @return
*/
@SuppressWarnings({ "rawtypes", "resource" })
public static Object getClassObject(String jarPath) {
try {
if(jarPath.indexOf("file:///")<0){
jarPath = "file:///"+jarPath;
}
URL url = new URL(jarPath);
JarUtil t = new JarUtil(url);
Map<String,List<String>> rtnList = new HashMap<String,List<String>>();
//通过jarFile和JarEntry得到所有的类
JarFile jar = new JarFile(jarPath.replace("file:///",""));
//返回zip文件条目的枚举
Enumeration<JarEntry> enumFiles = jar.entries();
JarEntry entry; //测试此枚举是否包含更多的元素
while(enumFiles.hasMoreElements()){
entry = (JarEntry)enumFiles.nextElement();
if(entry.getName().indexOf("META-INF")<0 && entry.getName().indexOf("eclipse")<0 && entry.getName().indexOf(".class")>=0){
String classFullName = entry.getName();
//去掉后缀.class
String className = classFullName.substring(0,classFullName.length()-6).replace("/", ".");
System.out.println("~~~~~~~~~~~~~~~Class名称:" + className); Class c ;
try {
c= t.findClass(className);
} catch (LinkageError e) {
c = Class.forName(className);
} //根据class对象获得属性
Field[] fields = c.getDeclaredFields();
for(Field f1 : fields){
//打印每个属性的类型
System.out.println("~~~~~~~~~~~~~~~属性类型:" + f1.getType());
//打印每个属性的名字
System.out.println("~~~~~~~~~~~~~~~属性名称:" + f1.getName());
}
//通过getMethod得到类中包含的方法
Method methods[] = c.getMethods();
for (Method method : methods) {
String sm = method.getName();
//打印除默认方法外的方法
if(DEFAULT_METHOD.indexOf(sm)<0){
System.out.println("方法名:" + sm);
} } }
} } catch (Exception ex) {
ex.printStackTrace();
}
return null;
} public static void main(String[] args) throws Exception { getClassObject("file:///C:\\Users\\zhang\\Desktop\\testrobot.jar");
}
}