2017-10-02 7 views
3

は、私がロードされているすべてのjarファイルファイルのパスを取得したいです。 を以前java8に、私はどのようJava9のJavaアプリケーションによってロードされたすべてのjarファイルを取得するには?何らかの理由で

for (java.net.URL url : ((java.net.URLClassLoader) A.class.getClassLoader()).getURLs()) { 
    try { 
     String path = url.toString(); 
     if (path.startsWith("file:/")) 
      path = path.substring(6); 
     path = java.net.URLDecoder.decode(path, "UTF-8"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

を使用してこれを行っているが、Java 9で、にSystemClassLoader connotは、URLClassLoaderのにキャスト。

現在、私はSomeClass.class.getProtectDomain().getCodeSource().getLocation()を使用していますが、これはかなりの費用がかかるので、私はここにこれを行うにはいくつかのより穏やかな方法を求めています。

+1

をあなたがこれを必要とするのはなぜ?何を達成したいのですか? –

+0

@ Usagi Miyamoto jarの絶対パスを取得したいだけです –

+0

'Java9'には以前のリリースのように' rt.jar'はありませんが、別のモジュールがあります。したがって、 'SystemClassLoader'は以前のように' URLClassLoader'のインスタンスではありません。 –

答えて

0

これを試してみてください:

/** 
* 
* @author hengyunabc 2017-10-12 
* 
*/ 
public class ClassLoaderUtils { 
    @SuppressWarnings({ "restriction", "unchecked" }) 
    public static URL[] getUrls(ClassLoader classLoader) { 
     if (classLoader instanceof URLClassLoader) { 
      return ((URLClassLoader) classLoader).getURLs(); 
     } 

     // jdk9 
     if (classLoader.getClass().getName().startsWith("jdk.internal.loader.ClassLoaders$")) { 
      try { 
       Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
       field.setAccessible(true); 
       Unsafe unsafe = (Unsafe) field.get(null); 

       // jdk.internal.loader.ClassLoaders.AppClassLoader.ucp 
       Field ucpField = classLoader.getClass().getDeclaredField("ucp"); 
       long ucpFieldOffset = unsafe.objectFieldOffset(ucpField); 
       Object ucpObject = unsafe.getObject(classLoader, ucpFieldOffset); 

       // jdk.internal.loader.URLClassPath.path 
       Field pathField = ucpField.getType().getDeclaredField("path"); 
       long pathFieldOffset = unsafe.objectFieldOffset(pathField); 
       ArrayList<URL> path = (ArrayList<URL>) unsafe.getObject(ucpObject, pathFieldOffset); 

       return path.toArray(new URL[path.size()]); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return null; 
    } 
} 
関連する問題