2009-05-04 36 views
0

問:訪問非公共類在sun.awt包[明確:FetcherInfo]

我在我的應用程序的一些性能問題 - 和瓶頸是sun.awt.image.ImageFetcher.run,我canno't得到任何(更)來自探查器的完整信息。所以我想,看看ImageFetcher正在做的工作會很好。

我無法訪問FetcherInfo類,該類包含所有ImageFetcher作業。要獲得FetcherInfo實例,我必須致電FetcherInfo.getFetcherInfo()

我在包sun.awt.image中創建了類(就在我的項目中,我沒有用rt.jar修補)。

要獲得FetcherInfo我使用:

try{ 
    for(Method method : FetcherInfo.class.getDeclaredMethods()){ 
     method.setAccessible(true); 
     if(method.getName().equals("getFetcherInfo")){ 
     m = method; 
     } 
    } 
}catch (Exception e){ 
    e.printStackTrace(); 
} 

FetcherInfo info = null; 
try { 
    info = (FetcherInfo) m.invoke(null); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    e.printStackTrace(); 
} 

而且我得到異常:Exception in thread "IMAGE-FETCHER-WATCHER" java.lang.IllegalAccessError: tried to access class sun.awt.image.FetcherInfo from class sun.awt.image.FetcherDebug

而且堆棧跟蹤點:

for(Method method : FetcherInfo.class.getDeclaredMethods()){ 

同樣的異常被提出:

FetcherInfo.class.getMethod("getFetcherInfo"); 

因此,任何人有任何想法如何可以:

  • 獲取ImageFetcher例如
  • 瞭解越來越裝什麼樣的圖像

SOLUTION

的問題是,我」我已將我的課程放入sun.java.awt包中以獲得對包保護成員的訪問權限,而不會將其放入rt.jar中,並且可以使用excep被投擲母雞叫ImageFetcher.class

回答

2

要訪問不可訪問的成員,請使用setAccessible(true)。 (如果沒有當前安全管理器,還有從反射使用上sun.*類沒有塊。)

import java.lang.reflect.Method; 

public class Access { 
    public static void main(String[] args) throws Exception { 
     Class<?> imageFetcher = Class.forName("sun.awt.image.FetcherInfo"); 
     for (Method method : imageFetcher.getDeclaredMethods()) { 
      ; 
     } 
     Method method = imageFetcher.getDeclaredMethod("getFetcherInfo"); 
     method.setAccessible(true); 
     Object fetcher = method.invoke(null); 
     System.err.println(fetcher); 
    } 
} 
+0

如果你的意思#方法setAccessible,我不能這樣做,因爲異常被拋出之前,我訪問方法實例(它會在調用FetcherInfo.class.getDeclaredMethods()時發生)。 – 2009-05-04 15:58:10