J'ai un numéro de ligne d'un fichier source Java et que vous souhaitez obtenir la méthode d'ensemble de ce numéro de ligne de manière programmable.
J'ai regardé Antlr qui n'a pas beaucoup aidé beaucoup. P>
Janino ( HTTP : //www.janino.net ) semble prometteur, je numériserais et analyserais (et si nécessaire compiler) le code. Ensuite, je pourrais utiliser JDI et p> toujours je ne sais pas comment utiliser JDI pour le faire et je n'ai trouvé aucun didacticiel qui va dans cette direction. P> peut-être peut-être Il manque une autre façon que je manque complètement. p> p>
3 Réponses :
Vous pouvez utiliser CodeVisitor de l'ASM à Récupérer les informations de la ligne de débogage d'une classe compilée. Cela vous permet d'économiser l'analyse des fichiers source Java. pour la classe A: p> Ceci produit: p> <init>
11
x
14
15
16
y
19
20
Salut! Merci pour cette bonne réponse. C'est presque ce que je cherchais. J'apprécie vraiment votre aide!
Peut-être que vous pouvez lancer une exception, l'attraper, extraire l'élément StackTrace correspondant pour obtenir le nom de la méthode. P>
Il n'est pas nécessaire d'analyser la trace de la pile. L'élément de trace de pile ( Java.sun.com/javase /6/docs/api/java/lang/stacktraceElement. HTML ) contient les informations.
Désolé d'être imprécis. Je dois obtenir la méthode d'une classe que je n'utilise pas.
Si vous utilisez Java 6, et si cela ne vous dérange pas d'utiliser les API de Sun, vous pouvez utiliser l'API Javac . Vous devrez ajouter outils.jar code> à votre classe de classe.
import java.io.IOException;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.LineMap;
import com.sun.source.tree.MethodTree;
import com.sun.source.util.JavacTask;
import com.sun.source.util.SourcePositions;
import com.sun.source.util.TreeScanner;
import com.sun.source.util.Trees;
public class MethodFinder {
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnosticsCollector = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticsCollector, null, null);
Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects("path/to/Source.java");
CompilationTask task = compiler.getTask(null, fileManager, diagnosticsCollector, null, null, fileObjects);
// Here we switch to Sun-specific APIs
JavacTask javacTask = (JavacTask) task;
SourcePositions sourcePositions = Trees.instance(javacTask).getSourcePositions();
Iterable<? extends CompilationUnitTree> parseResult = null;
try {
parseResult = javacTask.parse();
} catch (IOException e) {
// Parsing failed
e.printStackTrace();
System.exit(0);
}
for (CompilationUnitTree compilationUnitTree : parseResult) {
compilationUnitTree.accept(new MethodLineLogger(compilationUnitTree, sourcePositions), null);
}
}
private static class MethodLineLogger extends TreeScanner<Void, Void> {
private final CompilationUnitTree compilationUnitTree;
private final SourcePositions sourcePositions;
private final LineMap lineMap;
private MethodLineLogger(CompilationUnitTree compilationUnitTree, SourcePositions sourcePositions) {
this.compilationUnitTree = compilationUnitTree;
this.sourcePositions = sourcePositions;
this.lineMap = compilationUnitTree.getLineMap();
}
@Override
public Void visitMethod(MethodTree arg0, Void arg1) {
long startPosition = sourcePositions.getStartPosition(compilationUnitTree, arg0);
long startLine = lineMap.getLineNumber(startPosition);
long endPosition = sourcePositions.getEndPosition(compilationUnitTree, arg0);
long endLine = lineMap.getLineNumber(endPosition);
// Voila!
System.out.println("Found method " + arg0.getName() + " from line " + startLine + " to line " + endLine + ".");
return super.visitMethod(arg0, arg1);
}
}
}
Parlez-vous de la même manière DIFF -U? par exemple. @@ -3452,6 +3452,59 @@ NOID MYMETHOD (INT A, INT B)
Vous voulez le nom de la méthode ou le texte de la méthode?
Le nom de la méthode suffirait, mais le problème est résolu depuis longtemps. Merci quand même :-)