获取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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值