`

获取类的class文件的绝对路径 收藏

    博客分类:
  • cava
阅读更多

 获取类的class文件的绝对路径 收藏
    在java中,经常要定位某些文件的位置,为了能让程序与物理位置无关,就要使用相对路径。但java中使用相对路径总会遇到一些很麻烦的问题,就是到底相对于哪个参照物的问题。因为我们平时使用相对路径总是相对当前工作目录而言的,但有时需求并非如此。比如,要在一个开发包中使用相对路径,却不知道开发包被其他程序调用时的所在路径,而且特别是在web应用中,很难确定某个文件在整个应用中的相对路径。

    所以使用相对路径最好的办法就是让路径相对的参照物是我的开发包或我的应用本身的东西,最好的就是用我开发包中的类的class文件。只要知道了某个class文件的绝对路径,就可以以它为参照物,使用相对路径来定位其他任何文件了。

    为了实现这个想法,我写了这个Path类,这个类提供了两个静态公共方法,一个用来定位类的class文件的位置,另一个以某个类为参照物来定位一个相对路径。使用这两个方法,我们可以完全不必理会应用的当前工作路径,随心所欲的根据自己的位置来寻找任何文件。比如在编写某个功能性开发包时,就可以完全不用管调用这个开发包的应用的路径情况,而仅仅根据开发包本身的位置来定位文件,这样很好的实现了封装性,将文件的路径处理完全封闭在了开发包自身之内。

以下是Path类的源代码:

 /* 创建日期 2004-11-22
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package mytools;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;

/**
 * @author 由月
 * 
 * 这个类提供了一些根据类的class文件位置来定位的方法。
 */
public class Path {
 /**
  * 获取一个类的class文件所在的绝对路径。 这个类可以是JDK自身的类,也可以是用户自定义的类,或者是第三方开发包里的类。
  * 只要是在本程序中可以被加载的类,都可以定位到它的class文件的绝对路径。
  * 
  * @param cls
  *            一个对象的Class属性
  * @return 这个类的class文件位置的绝对路径。 如果没有这个类的定义,则返回null。
  */
 public static String getPathFromClass(Class cls) throws IOException {
  String path = null;
  if (cls == null) {
   throw new NullPointerException();
  }
  URL url = getClassLocationURL(cls);
  if (url != null) {
   path = url.getPath();
   if ("jar".equalsIgnoreCase(url.getProtocol())) {
    try {
     path = new URL(path).getPath();
    } catch (MalformedURLException e) {
    }
    int location = path.indexOf("!/");
    if (location != -1) {
     path = path.substring(0, location);
    }
   }
   File file = new File(path);
   path = file.getCanonicalPath();
  }
  return path;
 }

 /**
  * 这个方法可以通过与某个类的class文件的相对路径来获取文件或目录的绝对路径。 通常在程序中很难定位某个相对路径,特别是在B/S应用中。
  * 通过这个方法,我们可以根据我们程序自身的类文件的位置来定位某个相对路径。
  * 比如:某个txt文件相对于程序的Test类文件的路径是../../resource/test.txt,
  * 那么使用本方法Path.getFullPathRelateClass("../../resource/test.txt",Test.class)
  * 得到的结果是txt文件的在系统中的绝对路径。
  * 
  * @param relatedPath
  *            相对路径
  * @param cls
  *            用来定位的类
  * @return 相对路径所对应的绝对路径
  * @throws IOException
  *             因为本方法将查询文件系统,所以可能抛出IO异常
  */
 public static String getFullPathRelateClass(String relatedPath, Class cls)
   throws IOException {
  String path = null;
  if (relatedPath == null) {
   throw new NullPointerException();
  }
  String clsPath = getPathFromClass(cls);
  File clsFile = new File(clsPath);
  String tempPath = clsFile.getParent() + File.separator + relatedPath;
  File file = new File(tempPath);
  path = file.getCanonicalPath();
  return path;
 }

 /**
  * 获取类的class文件位置的URL。这个方法是本类最基础的方法,供其它方法调用。
  */
 private static URL getClassLocationURL(final Class cls) {
  if (cls == null)
   throw new IllegalArgumentException("null input: cls");
  URL result = null;
  final String clsAsResource = cls.getName().replace('.', '/').concat(
    ".class");
  final ProtectionDomain pd = cls.getProtectionDomain();
  // java.lang.Class contract does not specify
  // if 'pd' can ever be null;
  // it is not the case for Sun's implementations,
  // but guard against null
  // just in case:
  if (pd != null) {
   final CodeSource cs = pd.getCodeSource();
   // 'cs' can be null depending on
   // the classloader behavior:
   if (cs != null)
    result = cs.getLocation();

   if (result != null) {
    // Convert a code source location into
    // a full class file location
    // for some common cases:
    if ("file".equals(result.getProtocol())) {
     try {
      if (result.toExternalForm().endsWith(".jar")
        || result.toExternalForm().endsWith(".zip"))
       result = new URL("jar:".concat(
         result.toExternalForm()).concat("!/")
         .concat(clsAsResource));
      else if (new File(result.getFile()).isDirectory())
       result = new URL(result, clsAsResource);
     } catch (MalformedURLException ignore) {
     }
    }
   }
  }

  if (result == null) {
   // Try to find 'cls' definition as a resource;
   // this is not
   // document.d to be legal, but Sun's
   // implementations seem to //allow this:
   final ClassLoader clsLoader = cls.getClassLoader();
   result = clsLoader != null ? clsLoader.getResource(clsAsResource)
     : ClassLoader.getSystemResource(clsAsResource);
  }
  return result;
 }

 public static void main(String[] args) {
  try {
   System.out.println(getPathFromClass(Path.class));
   System.out.println(getFullPathRelateClass("../test/abc/..",
     Path.class));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/youyue/archive/2005/03/22/326477.aspx

分享到:
评论

相关推荐

    Java开发工具类

    - QrcodeUtils.java\防止SQL注入和XSS攻击Filter\获取文件绝对路径最后的文件夹名称\加密工具类 - CryptoUtils.java\日期工具类 - DateUtil.java\图片处理工具类 - ImageUtils.java\文件相关操作工具类——FileUtils...

    Python 获取项目根路径的代码

    在 运行,调试,打包成exe 三个不同场景下获取跟路径,用于解决获取资源文件绝对路径问题。 工具类代码如下: import sys import os class pathutil(object): 路径处理工具类 def __init__(self): # 判断调试...

    Android Uri和文件路径互相转换的实例代码

    * 专为Android4.4设计的从Uri获取文件绝对路径 */ public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION

    strust文件上传

    // 获得系统的绝对路径 String dir = servlet.getServletContext().getRealPath("/image"); //我上传的文件没有放在服务器上。而是存在D:D:\\loadfile\\temp\\ String dir="D:\\loadfile\\temp\\"; int i = 0; ...

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

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    snoics-reptile 网页爬虫2.0

    将配置文件中的path节点的值改为conf文件夹在系统中的绝对路径, 如: c:\snoics-reptile\conf b、配置 conf\snoics-systemconfig.xml 文件 其中parameters节点中的配置为对需要抓取的网站的参数的...

    xmljava系统源码-onlineJudge:使用JSP实现的OJ系统,支持用户提交C、C++和Java语言的代码

    INF路径下),然后用一个监听类来获取这个文件的绝对路径地址,在ConnectionDao这个类里读取出相应的信息,这样移植起来就方便啦,不给源码只给编译后的class文件的话也可以修改数据库。 判题的隔离问题使用Docker来...

    vc++ 开发实例源码包

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    cms后台管理

    <bean id="cms_content_list" class="com.jeecms.cms.action.directive.ContentListDirective"/>(声明标签对应的类) <bean id="staticPageSvc" class="com.jeecms.cms.staticpage.StaticPageSvcImpl"> ...

    spring源代码

    //将只返回文件系统的类路径不返回jar的跟路径 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:asm-*.txt"); Assert.assertTrue(resources.length == 0); //将通过...

    java源码包---java 源码 大量 实例

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    c# 加密和解密相关代码

    本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode...

    Android插件框架Android-Plugin-Framework.zip

    插件编译出来以后,可以将插件复制到sdcard,然后在宿主程序中调用PluginLoader.installPlugin("插件apk绝对路径")进行安装 还有一种简易的安装方式,是使用编译命令为 “ant clean debug install” 直接将...

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

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    java源码包2

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    java源码包3

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    java源码包4

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    4-11.aspx 使用Server对象来获取文件路径。 4-12.aspx 使用Server对象对字符进行编码。 4-13.aspx 使用Server对象进行解码。 4-14.aspx 向客户机器写入Cookie。 4-15.aspx 读取Cookie。 ...

    linux大作业报告

    getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。 12、编写程序,编写shell命令中的cp命令。 13、编写Shell命令中的cat命令。 14、编写Shell命令中的tail命令。(用...

Global site tag (gtag.js) - Google Analytics