`
kinganpo
  • 浏览: 50940 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

获取jar包相关信息的补充

    博客分类:
  • java
阅读更多
该工具类可以获取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);
	}
}
分享到:
评论

相关推荐

    JAVA获取操作系统名称

    java获取操作系统名称,通过 System.getProperty("os.name") 由于JDK的bug,Windows Server 2012 R2获取到的System.getProperty("os.name") 为 Window NT unknown ...相关jar包:jna-4.0.0.jar jna-platform-4.0.0.jar

    win64位 jdk6,jdk7,jdk8版本 开发工作可以用到,为不方便在官网下载小伙伴分享

    jar:打包工具,将相关类文件打包成一个文件。 javadoc:文档生成器,从源码注释中提取文档。 jdb:debugger,差错工具。 JDK中还包括完整的JRE(java runtime environment,Java运行环境),也被称为Private ...

    java开源包8

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包4

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    黑马安卓基础day2

    有文档,用到的工具软件,jar包,笔记,图解,源码+注释。视频太大放不上来。以下为今日教学内容,仅供参考。 14_android下的junit测试.avi 15_android下的数据持久化,保存数据到rom文件.avi 16_android_data目录下...

    java开源包1

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包2

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包3

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包6

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包5

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包10

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包11

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包7

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包9

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包101

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    Java资源包01

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    aws-glue-libs:AWS Glue库是对ETL操作的Spark的补充和增强

    在本地运行胶粘剂pyspark shell,胶粘剂parksubmit和pytest 现在可以通过s3支持的maven存储库中的maven构建系统使用Glue ETL jar。 我们在maven中使用copy-dependencies目标来获取本地胶水所需的所有依赖关系。 从...

    JAVA上百实例源码以及开源项目源代码

    Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测 用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作...

    skill-sample-java-fact:一个Alexa技能样本,演示如何使用Alexa Skills Kit(ASK)SDK v2编写Java Echo Show和Echo Spot技能

    请参阅将参考进行获取有关创建具有针对您技能的正确角色的AWS Lambda函数的演练。 创建函数时,选择“从头开始编写”选项,然后选择Java 8运行时。 接下来,打开终端并转到包含pom.xml的目录,然后运行“ mvn ...

    NationStatesBattleSim:民族国家角色扮演的战斗模拟器

    NationStates Battle Simulator 是民族国家的角色扮演补充和战斗模拟器。 它旨在从用户那里获取不同战斗因素的输入:兵力计数、士气、技术、训练、战斗经验、后勤和英特尔,并模拟小规模冲突的结果以进行角色扮演。 ...

Global site tag (gtag.js) - Google Analytics