2010-02-10 4 views
4

Je dispose d'un fichier src .java qui ressemble à ceci:Génération de code Java: comment modifier une méthode de fichier java existante?

 
class Test { 

    public void foo() { 
    } 

} 

Je souhaite modifier foo() programatically, en ce sens, dire ajouter un sysout et la faire ressembler à ceci:

 
public void foo() { 
    System.out.println("hello world"); 
} 

Existe-t-il des moyens connus de le faire en ne modifiant PAS directement le fichier src (RandomAccessFile)?

Quelques publications sur StackOverflow se réfèrent à CodeModel et à l'AST d'Eclipse JDT pour la génération de code. Je vois que ceux-ci vont aider à la génération de code à partir de zéro, et ne pas modifier le code existant. Y at-il une API qui vous permettrait de modifier le code existant et qui a une API aussi simple que AST de CodeModel/Eclipse JDT? Si non, quelle serait la meilleure façon de le faire?

+2

Pourquoi voulez-vous faire? Est-ce un problème que vous ne pouvez pas résoudre sans génération de code? –

+0

@Thomas Jung: il y a beaucoup de cas où "l'instrumentation de code octet" est utile. – SyntaxT3rr0r

Répondre

2

Vous pouvez utiliser une bibliothèque de manipulation de byte-code, par ex. JavaAssist. Voir la section 4.2 Modification d'un corps de méthode dans le tutoriel pour javaassist: http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html

+0

@uthark: "instrumentation de code source"! = "Instrumentation de code octet". L'original parle spécifiquement de code src et d'AST, ce qui suggère que l'instrumentation de code octet ne semble pas correcte. – SyntaxT3rr0r

+0

@uthark: oups désolé, j'ai mal lu la question, il est en fait après l'instrumentation de code octet. d'une certaine façon, je pensais qu'il était après l'instrumentation de code source. – SyntaxT3rr0r

+0

@uthark JavaAssist, ne fonctionne pas pour Java 1.5 :-( – Jay

0

Vous pouvez obtenir la génération de code à l'aide des modèles de JET ou écrire des processeurs d'annotation personnalisés. Note: sur une note différente, les frameworks orientés Aspect réalisent ceci en utilisant un concept appelé le tissage de code, quand les découpes de points sont définies.

0

Si vous souhaitez modifier un fichier de code source, vous avez besoin d'un système de transformation de programme. Le DMS Software Reengineering Toolkit est un outil de transformation de programme qui lit le code source, construire des structures de données de compilation (ASTs, tables de symboles, graphiques de flux), vous permet d'appliquer des réécrits source-à-source au code représenté comme ces structures, en utilisant des modèles source pour correspondre/remplacer, puis régénérer une source valide à partir du résultat.

DMS a analyseur/prettyprinters pour de nombreuses langues, y compris Java, C, C++, C#, COBOL, PHP, JavaScript, ...

0

Si vous insistez pour travailler cela avec la génération de code, ce que vous pourriez faire est générer une classe Stub pour la classe Test, puis a la classe Test étend la classe Stub. Comme cette

 

class Test extends TestStub {
  @Override
  public void foo() {
    super.foo();
  }
}
// Generated stub class
class TestStub {
  public void foo() {
    System.out.println("hello world");
  }
}
0

Si vous essayez de modifier le code source et non byte code, vous pouvez utiliser la classe ASTRewrite de la bibliothèque AST Eclipse JDT pour modifier un fichier de code source Java existant. Vous pouvez affiner la documentation ici .. ASTRewrite

Vous trouverez des exemples ici .. Using ASTRewrite