Comment obtenir le source de nom de fichier/ligne-numéro à partir d'un java.lang.Class objet

Est-il possible, compte tenu d'une java.lang.Class objet, pour obtenir le nom du fichier source et le numéro de la ligne à laquelle le recours a été déclaré?

Les données devraient être disponibles dans les .class du fichier d'informations de débogage. Le seul endroit que je connais, où le JDK retourne les informations de débogage est dans java.lang.StackTraceElement mais je ne suis pas sûr si c'est possible à force de Java pour créer un java.lang.StackTraceElement exemple pour un usage arbitraire de la classe, parce que nous ne sommes pas à l'exécution d'une méthode dans la classe.

Mon exact de cas d'utilisation est un anonyme intérieur de la classe qui a un générés par le compilateur nom. Je veux savoir le nom de fichier et le numéro de ligne de la déclaration de classe.

Je préfère ne pas utiliser un byte-code de la manipulation, mais je peux retomber si je dois le faire.

Pourquoi? Qu'est-ce que la fonction que vous souhaitez offrir à l'utilisateur final par la détermination de cette information?
Lorsque vous déboguez une application et que vous voyez un objet d'une classe générique à partir de laquelle vous avez plusieurs instances. Mais tous ces cas, une référence à un Listener instance où Listener est une interface ou une classe abstraite. Vous pouvez les distinguer par le béton de classe de leur Listener référence: si c'est un XxxListener vous lire XxxListener.java et obtenir une idée de ce qu'est-ce qu'il va faire, mais que pouvez-vous faire si le Listener est une instance de SomeOuterClass$12?
vous avez juste fait de l'argument pour expliquer pourquoi vous devriez définir l'ensemble de vos auditeurs nommés des classes. Il va ajouter ligne de code supplémentaire, mais de simplifier le débogage, rendre les méthodes où vous créez votre interface des objets beaucoup plus lisible, et de faire vos modules plus facile à maintenir, dans l'ensemble.
Vous êtes argument implique réellement interdisant anonyme classes tout à fait, parce qu'ils ne seront pas obtenir un nom significatif de toute façon et de débogage sans nom est difficile. Je ne suis pas avec cet argument. Anonyme les classes internes sont utiles pour le langage et ils vont devenir encore plus courantes pour le lambda de la syntaxe de sucre est ajoutée à Java. Je crois donc que nous devons trouver un moyen d'activer le débogage plutôt que l'inverse.
mon argument n'implique pas l'interdisant les classes internes anonymes, simplement en limitant leur utilisation. Pour de courte durée ou à portée limitée des opérations, je n'ai pas de questions. Quelque chose qui est de longue durée, ou de l'étendue du mérite son propre nom.

OriginalL'auteur Saintali | 2011-09-20