Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 305|回复: 0

[Java基础知识]获取类的class文件的绝对路径

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 17:04:12 | 显示全部楼层 |阅读模式
    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("../..",  Path.class));
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
    }

    程序运行结果:
    C:javacom>java Path
    C:javacomPath.class
    C:

      
      
       
       

         
       

         
       
      


    源码下载:http://file.javaxxz.com/2014/10/1/170412172.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 12:22 , Processed in 0.422924 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表