知识大全 如何寻一个类X实例中类的物理所在

Posted 文件

篇首语:归志宁无五亩园,读书本意在元元。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何寻一个类X实例中类的物理所在相关的知识,希望对你有一定的参考价值。

如何寻一个类X实例中类的物理所在?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   问题: 当我拥有一个类X的实例 我怎么在运行的时候实时找出它的类的物理所在?  在我给你答案之前 我必须指出 如果你坚持养成一个好习惯 编程序时总是考虑与硬盘位置无关 那么你的java学习将会进展的很顺利 当你要装载资源的时候 比如一些属性和配置文件 尽可能的使用ResourceBundle getBundle()而不是使用java util File 除非真的是必须这样 这样做不仅有利于你的J EE应用开发 而且越到后来 你就越会发现 我怎么有那么多东西要装载?这个时候 你就会觉得这个方法确实给你带来了方便     尽管如此 追寻到class的根源有时候在程序测试和debug的时候会很有用 由于这个想法 我给出了一种很有帮助的方法能够替我们完成这个任务 这些所有都是基于j se的api的   /**     * Given a Class object attempts to find its class location [returns null     * if no such definition can be found] Use for testing/debugging only      *      * @return URL that points to the class definition [null if not found]      */    public static URL getClassLocation (final Class cls)          if (cls == null) throw new IllegalArgumentException ( null input: cls );            URL result = null;      final String clsAsResource = cls getName () replace ( / ncat ( 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 mon cases:          if ( file equals (result getProtocol ()))                      try                          if (result toExternalForm () endsWith ( jar ) ||                result toExternalForm () endsWith ( zip ))                 result = new URL ( jar:ncat (result toExternalForm ())                 ncat( !/ ncat (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;          你最好通过这个类的ProtectionDomain方法来获得这个类的代码文件来源以及url地址 然而 有一个问题就是 Class getProtectionDomain()似乎并不会返回一个null值 在api里也似乎是这么说的 但是Class getProtectionDomain()并不一定就会返回一个有效的url值 所以我们在后面通过判断result来得知是否有效     所有的细节都是classloader的动作 我们知道 classloader就是装载和定义我们的class的 通过java lang ClassLoader defineClass()— 个参数 而且ProtectionDomain参数不能为空 我们可以建立需要的类以及相关受保护的区域     一般来讲 URLClassLoader以及相关的扩展一般都会遵循这个规则 但是并非所有自定义的classloader都会保证自动实现它     如果第一步失败了 你可以试试通过getResource()来获得 class结尾的文件的位置 Java规范里面并没有详细说明这样作是否允许:因为 任何代码都能通过URLS读取整个类的定义 是一个潜在的安全漏洞 有一些jvm已经禁止通过getResource()来装载 class文件 然而 sun的jdk却是通过这个途径来装载类的 这似乎传递了某些合法的信息     最后 千万不要忘记 不要去寻找任何不存在的东西 一个java lang Class类是不需要真正存在一个 class文件的 一个明显的例子就是动态代理类:它的字节码定义是在运行的时候合成的 对于它 getClassLocation()将会返回null 将来 j ee里面将更多的依靠这种运行时构造的方法 因为这些原因 还有就是虚拟机各自都不同 我提供的这种方法你最好只是用来做测试和debug cha138/Article/program/Java/JSP/201311/19616

相关参考

知识大全 浅谈JAVA中类的构造器

浅谈JAVA中类的构造器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现在越来越多的人开始学习

知识大全 用.NET动态创建类的实例讲解

用.NET动态创建类的实例讲解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  看了网上很多关于D

知识大全 析构函数用于销毁类的实例

  析构函数是通过下面的形式声明的   [attributes]~identifier()destructorbody   其中  attr

知识大全 类的实例创建

  矩形类Rectangle中也许你想把矩形的相关信息写入类如  intwidthheight;    当然你还可以写入其它信息但或许长和宽对简单的矩形来说已足够了现在类的定义如下所示  public

知识大全 关于Java程序中类加载完全揭密

关于Java程序中类加载完全揭密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  类加载是java

知识大全 Java 类中类属性和对象属性的初始化顺序

Java类中类属性和对象属性的初始化顺序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java

知识大全 检测你数据库连接的物理状态

  检测你数据库连接的物理状态    ZDNetChina    //    URL:    创建连接        JavaJDBCAPI各种类的一个基石是javasqlConnection类很多问

知识大全 新增匿名类[2]

  二初始化  如果一个类有public字段在建立类的对象实例时可以使用下面的代码来初始化这些字段;publicclassMyClasspublicStringfield;publicintfield

知识大全 构造函数和析构函数

  类构造函数  本节将讨论三种类构造函数  类构造函数的类型  注释  实例  用于创建并初始化类的实例  私有  在类之外不可访问的特殊类型实例构造函数无法用私有构造函数来实例化类  静态  在创

知识大全 静态成员

   除了publicprivate和protected以外你还可以把成员说明为static(静态)static修饰符表明一个变量或成员函数对所有类的实例都是相同的你也许想使用一个所有Rectangl