2012-01-02 4 views
4

Est-il possible d'accéder à la méthode anonySubClassMethod? Si non pourquoi le compilateur Java permettant de créer cette méthode?Accès à la méthode de classe anonyme

abstract interface AnonyIfc { 
    public abstract void methodIfc(); 
} 

public class AnonyImplementation { 
    public static void main (String... a) { 
     AnonyIfc obj = new AnonyIfc(){ 
     public void methodIfc() { 
      System.out.println("methodIfc"); 
     } 
     public void anonySubClassMethod() { 
      System.out.println("anonySubClassMethod"); 
     } 
     }; 
     //obj.anonySubClassMethod() won't be visible since refering sub class 
     //       method with super class reference 
    } 
} 

Mise à jour
De Francis Upton Je compris que anonySubClassMethod peut être utilisé dans la classe anonyme. Alors, est-ce que je peux m'attendre à ce que le compilateur java restreigne le spécificateur d'accès à private pour anonySubClassMethod? Espérons qu'il y aura une raison pour ce spécificateur public aussi. juste curieux.

+1

Une interface elle-même et des méthodes dans l'interface sont par défaut *** abstrait *** par conséquent, il n'y a aucune signification pour utiliser un tel mot-clé avec eux. Vous pouvez toujours l'éviter. – Lion

Répondre

2

La méthode peut être appelée depuis votre classe anonyme. Et l'utilisation la plus typique de cette construction est cas où vous implémentez une interface (pour un écouteur GUI par exemple), donc la méthode sera connue car c'est une implémentation de l'interface attendue par l'appelant.

+0

Merci. Donc, puis-je attendre du compilateur de restreindre le modificateur d'accès pour anonySubClassMethod est seulement privé? –

+1

Non, dans le cas où l'objet implémente une interface utilisée, la méthode devra être publique. C'est le cas habituel comme je l'ai mentionné dans ma réponse. Le fait que vous ne puissiez pas appeler la méthode parce qu'elle n'est pas définie dans la classe n'a rien à voir avec sa visibilité, c'est parce qu'elle n'est pas connue de l'appelant. Si vous regardez le code généré, il crée en fait une autre classe avec un suffixe $ n. –

5

Vous pouvez utiliser la réflexion pour y accéder, mais sinon, il n'y a aucun moyen d'y accéder à partir de n'importe quel code en dehors de la classe anonyme. Mais cela ne signifie pas que vous ne pouviez pas accéder à partir de au sein de la classe. methodIfc() pourrait l'appeler, et c'est pourquoi le compilateur ne peut pas facilement déclarer qu'il s'agit d'un code mort.

+0

La réflexion explique aussi pourquoi il y a un sens dans le langage permettant des méthodes publiques dans des classes anonymes qui ne sont pas définies dans les interfaces/superclasses. –

+0

@Ernest, la réflexion n'est pas la seule façon d'y accéder. Regardez la réponse de Paul. – Pacerier

+0

@Pacerier - avez-vous réellement * lu * cette réponse? En particulier, les deuxième et troisième phrases? –

9

Comme d'autres l'ont noté, la méthode peut être appelée depuis la classe. La seule façon de l'appeler de l'extérieur de la classe (en plus d'utiliser la réflexion) serait comme suit:

new Object() { 
    void doSomething() { 
     //code 
    } 
}.doSomething(); 
+0

Merci. Nouvel apprentissage :) –

2

La raison pour laquelle le compilateur ne limite pas la visibilité de anonySubClassMethod à privé est que cette méthode est accessible par moyens de réflexion: obj.getClass().getMethod("anonySubClassMethod").invoke(obj)

Si vous ne voulez pas utiliser la réflexion, il n'y a aucun moyen d'invoquer cette méthode.

+0

Il y a un moyen sans utiliser la réflexion. Regardez la réponse de Paul. – Pacerier

Questions connexes