Java绝对路径读取jar包

时间:2021-03-19 09:11:53

方法一:

package com.demo.action;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub
try {
URL url = new URL("file:/D:/maven_web.jar");
@SuppressWarnings("resource")
URLClassLoader myClassLoader = new URLClassLoader( new URL[] { url } );
Class<?> myClass = myClassLoader.loadClass("com.huahua.inter.impl.UserImpl");
Method[] methods = myClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

}

方法二:

package com.demo.action;

import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class test1 {
public static void main(String[] args) {
String path = "D:\\maven_web.jar";//外部jar包的路径
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();//所有的Class对象
Map<Class<?>, Annotation[]> classAnnotationMap = new HashMap<Class<?>, Annotation[]>();//每个Class对象上的注释对象
Map<Class<?>, Map<Method, Annotation[]>> classMethodAnnoMap = new HashMap<Class<?>, Map<Method,Annotation[]> >();//每个Class对象中每个方法上的注释对象

try {
@SuppressWarnings("resource")
JarFile jarFile = new JarFile(new File(path));
URL url = new URL("file:" + path);
@SuppressWarnings("resource")
ClassLoader loader = new URLClassLoader(new URL[]{url});//自己定义的classLoader类,把外部路径也加到load路径里,使系统去该路经load对象
Enumeration<JarEntry> es = jarFile.entries();
while (es.hasMoreElements()) {
JarEntry jarEntry = (JarEntry) es.nextElement();
String name = jarEntry.getName();
//System.out.println(name);
if(name != null && name.endsWith(".class")){//只解析了.class文件,没有解析里面的jar包
//默认去系统已经定义的路径查找对象,针对外部jar包不能用
//Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(name.replace("/", ".").substring(0,name.length() - 6));
Class<?> c = loader.loadClass(name.replace("/", ".").substring(0,name.length() - 6));//自己定义的loader路径可以找到

if(c.isInterface()) continue; //排除接口类

System.out.println(c);
classes.add(c);
Annotation[] classAnnos = c.getDeclaredAnnotations();
classAnnotationMap.put(c, classAnnos);
Method[] classMethods = c.getDeclaredMethods();
for (Method method : classMethods) {
System.out.println(method.getName());//打印所有自定义的方法
}
Map<Method, Annotation[]> methodAnnoMap = new HashMap<Method, Annotation[]>();
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 (Exception e) {
e.printStackTrace();
}
}
}



方法二转自: http://blog.csdn.net/wan368500/article/details/8215668