获取jar包相关信息的补充

该工具类可以获取jar包(工程项目外部或内部引用均可)中的类及对象,还可以动态获得项目打包jar后的路径信息等。

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
/**
 * 获取jar的相关信息
 * @author Administrator
 *	2011-01-16 13:53:12
 */
public class JarTool extends URLClassLoader {
	
	public JarTool() {
		super(new URL[0]);
	}
	//获取外部jar包里的类
	//此处的jarPath为项目工程外的jar包绝对路径名
	//例如 E:/java/jar/tool.jar
	public  Class<?> getExternalClass(String jarPath,String classPath){
		try {
			addURL(new URL("file:///"+jarPath));
			return findClass(classPath);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}
	//获取内部jar包里的类
	//此处的jarPath为项目工程里面的jar包相对路径名
	//例如 /lib/tool.jar
	public  Class<?> getInternalClass(String jarPath,String classPath){
		addURL(getClass().getResource(jarPath));
		try {
			return findClass(classPath);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取jar包里的对象  用此方法不需要把jar包添加到class path中就可以用到里面的类
	 * 例:Object[] obj = {new String("kinganpo",24)};
	 * 	   getObject("E:/java/jar/tool.jar","com.whvcse.kinganpo.Test",true,obj);
	 * @param jarPath jar路径
	 * @param className jar包里的类全名 
	 * @param isExternal 是否为外部jar
	 * @param initargs 构造方法参数列表
	 * @return 
	 */
	public Object getObject(String jarPath,String className,boolean isExternal,Object... initargs){
		Class<?>[] clazz = null;
		Class<?> c = null;
		if(isExternal){
			c = getExternalClass(jarPath,className);
		}else{
			c = getInternalClass(jarPath,className);
		}
		try {
			if(initargs!=null){
				clazz = new Class[initargs.length];
				for(int i=0;i<initargs.length;i++){
					//由于JDK自动装包/拆包,像int这些基本类型自动转换为Integer
					//而int.class和Integer.class是不同的,所以需要判断
					if(initargs[i] instanceof Integer){
						clazz[i] = int.class;
					}else if(initargs[i] instanceof Long){
						clazz[i] = long.class;
					}else if(initargs[i] instanceof Short){
						clazz[i] = short.class;
					}else if(initargs[i] instanceof Byte){
						clazz[i] = byte.class;
					}else if(initargs[i] instanceof Double){
						clazz[i] = double.class;
					}else if(initargs[i] instanceof Float){
						clazz[i] = float.class;
					}else if(initargs[i] instanceof Boolean){
						clazz[i] = boolean.class;
					}else{
						clazz[i] = initargs[i].getClass();
					}
				}
				return c.getConstructor(clazz).newInstance(initargs);
			}else{
				return c.getConstructor().newInstance();
			}
		} catch (Exception e) {
			return null;
		}
	}

	//获取jar绝对路径
	public static String getJarPath(){
		File file = getFile();
		if(file==null)return null;
		 return file.getAbsolutePath();
	}
	//获取jar目录
	public static String getJarDir() {
		File file = getFile();
		if(file==null)return null;
	     return getFile().getParent();
	}
	//获取jar包名
	public static String getJarName() {
		File file = getFile();
		if(file==null)return null;
		return getFile().getName();
	}

	private static File getFile() {
		//关键是这行是获取当前的绝对路径信息 
		String path = JarTool.class.getProtectionDomain().getCodeSource().getLocation().getFile();
        try{
        	//此行是将path中的空格和中文“乱码”转换正确回显
            path = java.net.URLDecoder.decode(path, "UTF-8");
        }catch (java.io.UnsupportedEncodingException e){
            return null;
        }
		return new File(path);
	}
}

你可能感兴趣的:(jdk,C++,c,.net,C#)