2009-05-04 12 views
0

Question:accès des classes non publiques en paquet sun.awt [spécifiquement: FetcherInfo]

J'ai un problème de performance dans mon application - et le goulot d'étranglement est sun.awt.image.ImageFetcher.run, et je canno't obtenir une (plus) informations significatives de profiler. J'ai donc pensé que ce serait bien de regarder les travaux que fait ImageFetcher.

Je n'ai pas pu accéder à la classe FetcherInfo, qui contient tous les emplois ImageFetcher. Pour obtenir FetcherInfo instance, je dois appeler FetcherInfo.getFetcherInfo().

J'ai créé la classe dans le paquet sun.awt.image (juste dans mon projet, je n'ai pas bricolé avec rt.jar).

Pour FetcherInfo j'utiliser:

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(); 
} 

Je me exception: Exception in thread "IMAGE-FETCHER-WATCHER" java.lang.IllegalAccessError: tried to access class sun.awt.image.FetcherInfo from class sun.awt.image.FetcherDebug

Et les points de trace de pile à:

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

La même exception a été soulevée par:

FetcherInfo.class.getMethod("getFetcherInfo"); 

Alors quelqu'un a des idées comment soit:

  • Obtenir exemple ImageFetcher
  • Découvrez ce que les images se charger

SOLUTION

Le problème était que je » J'ai mis ma classe dans le paquet sun.java.awt pour avoir accès aux membres protégés du paquet, sans le mettre dans rt.jar, et excep tion a été lancée poule appelant ImageFetcher.class.

Répondre

2

Pour accéder aux membres non-accessibles, utilisez setAccessible(true). (Sans un responsable de la sécurité actuelle, il n'y a pas de bloc sur sun.* cours d'être utilisé avec la réflexion.)

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

Si vous voulez dire Méthode # setAccessible, je ne peux pas le faire, parce exception est levée avant que je accès à instance de méthode (elle apparaît lors d'un appel à FetcherInfo.class.getDeclaredMethods()). –

+1

Fonctionne pour moi! Qu'est-ce que tu fais c'est bizarre? Pouvez-vous écrire un petit exemple complet qui démontre le problème. –

+0

Dumb, muet, stupide moi. Tout fonctionne maintenant :) le problème appelait FetcherInfo.class. –

Questions connexes