国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

如何尋一個類X實例中類的物理所在?

2019-11-18 13:18:46
字體:
來源:轉載
供稿:網友

  問題: 當我擁有一個類X的實例,我怎么在運行的時候實時找出它的類的物理所在?
  在我給你答案之前,我必須指出,假如你堅持養成一個好習慣--編程序時總是考慮與硬盤位置無關,那么你的java學習將會進展的很順利.當你要裝載資源的時候,比如一些屬性和配置文件,盡可能的使用ResourceBundle.getBundle()而不是使用java.util.File,除非真的是必須這樣.這樣做不僅有利于你的J2EE應用開發,而且越到后來,你就越會發現,我怎么有那么多東西要裝載?這個時候,你就會覺得這個方法確實給你帶來了方便.
  
  盡管如此,追尋到class的根源有時候在程序測試和debug的時候會很有用,由于這個想法,我給出了一種很有幫助的方法能夠替我們完成這個任務,這些所有都是基于j2se的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 ('.', '/').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 (".z                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;
    }
   
  你最好通過這個類的ProtectionDomain方法來獲得這個類的代碼文件來源以及url地址.然而,有一個問題就是, Class.getProtectionDomain()似乎并不會返回一個null值-在api里也似乎是這么說的. 但是Class.getProtectionDomain()并不一定就會返回一個有效的url值,所以我們在后面通過判定result來得知是否有效.
  
  所有的細節都是classloader的動作,我們知道,classloader就是裝載和定義我們的class的.通過java.lang.ClassLoader.defineClass()—5個參數,而且ProtectionDomain參數不能為空,我們可以建立需要的類以及相關受保護的區域.
  
  一般來講, java.net.URLClassLoader以及相關的擴展一般都會遵循這個規則,但是并非所有自定義的classloader都會保證自動實現它.
  
  假如第一步失敗了,你可以試試通過getResource()來獲得.class結尾的文件的位置.Java規范里面并沒有具體說明這樣作是否答應:因為,任何代碼都能通過URLS讀取整個類的定義,是一個潛在的安全漏洞.有一些jvm已經禁止通過getResource()來裝載.class文件.然而,sun的jdk卻是通過這個途徑來裝載類的,這似乎傳遞了某些合法的信息.
  
  最后,千萬不要忘記,不要去尋找任何不存在的東西,一個java.lang.Class類是不需要真正存在一個.class文件的.一個明顯的例子就是動態代理類:它的字節碼定義是在運行的時候合成的. 對于它,getClassLocation()將會返回null. 將來,j2ee里面將更多的依靠這種運行時構造的方法.因為這些原因,還有就是虛擬機各自都不同,我提供的這種方法你最好只是用來做測試和debug.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杭州市| 邵阳市| 赤城县| 永平县| 丹阳市| 天长市| 左云县| 安新县| 徐水县| 铜山县| 马关县| 杭州市| 新沂市| 瓦房店市| 奉新县| 宁津县| 灵璧县| 西乌珠穆沁旗| 姜堰市| 河间市| 桂东县| 彭州市| 集安市| 彭山县| 望奎县| 麦盖提县| 云南省| 高碑店市| 五常市| 兴山县| 丹凤县| 报价| 新竹县| 深州市| 碌曲县| 潞西市| 囊谦县| 新邵县| 南丰县| 砀山县| 永丰县|