首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

获取jar包相干信息的补充

2012-12-21 
获取jar包相关信息的补充该工具类可以获取jar包(工程项目外部或内部引用均可)中的类及对象,还可以动态获得

获取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.jarpublic  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.jarpublic  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);}}

热点排行