2010-05-26 3 views
1

Voici un exemple de programme testé en Java 1.5.Exception lors de l'accès réfléchi à la classe interne

Je me demande pourquoi les deux approches ci-dessous ont un résultat différent. Est-ce un bug ou une sorte de fonctionnalité Java?

package test; 

public class TestOut { 
    public static void main(String[] args) { 
     // works 
     new TestIn(); 

     // throws IllegalAccessException 
     Class.forName("test.TestOut$TestIn").newInstance(); 
    } 

    private static class TestIn { 
    } 
} 

Répondre

3

La classe est privée, d'où le IllegalAccessException - vous pouvez utiliser:

Class cls = Class.forName(...); 
Constructor c = cls.getDeclaredConstructors()[0]; 
c.setAccessible(true); 
c.newInstance(); 

Pour mémoire, l'exception a un message, ce qui est assez descriptif. La prochaine fois, n'omettez pas cette information de la question. (En fait, je ne suis pas sûr que ce message existe sur Java 1.5, non?)

classe test.Test ne peut pas accéder à un membre de la classe test.TestOut $ Testin avec des modificateurs "privés"

Le problème réside dans la méthode verifyMemberAccess(..) de sun.reflect.Reflection, et qu'il ne prend pas en compte les classes englobantes. Si un membre (constructeur) est privé, l'accès est refusé.

+1

Comment explicite 'new' fonctionne-t-il même s'il est' private'? – polygenelubricants

+0

Je pense que parce que la réflexion élimine le contexte, et le contexte est que la classe interne appartient à l'extérieur. L'objet Class conserve lui-même la référence à la classe englobante, mais pas le constructeur. – Bozho

+0

3x, Bozho. le "contexte" est ce que je me demande vraiment. À mon humble avis, le constructeur devrait avoir suffisamment d'informations pour connaître la classe enclsong, et il ne semble pas y avoir de bonne raison de l'implémenter de cette manière. – MikeJiang

2

Ceci est Bug ID 4221909:

Synopsys: (réfléchir) Class.newInstance() lancers francs IllegalAccess Error Exception lorsque la classe a un non public class
intérieur État: 6-Fix Entendue, bug
Priorité: 4-Bas
Date de soumission: 19-MAR-1999

+0

et un très vieux :) – Bozho

Questions connexes