2017-08-02 3 views
0

Je suis un novice complet en créant des archétypes maven, j'ai lu beaucoup de messages avant que je décide de poser cette question. Je veux créer un modèle pour construire de nouveaux projets suite à une structure définie par une interface (créée par moi):Utiliser les noms de méthodes d'une de mes classes utiliser la réflexion pour créer un archétype maven

package com.jh.interfaces; 
public interface VideoPlayerInterface { 
    void play(); 
    void pause(); 
    void rewind(); 
    void stop(); 
    void fastFordward(); 
} 

Je voudrais créer une classe qui l'emporte dont les méthodes, quelque chose comme ceci:

package com.jh.impl; 
public class VideoPlayerCustom implements VideoPlayerInterface { 
    public void play(){} 
    public void pause(){} 
    public void rewind(){} 
    public void stop(){} 
    public void fastFordward(){} 
} 

pour ce faire, j'ai trouvé sujets dans SO qui a utilisé la réflexion pour faire des choses similaires avec les classes Java, mais je n'a pas pu obtenir des résultats en utilisant mon interface, même avec une opération simple pour commencer:

public class ${library-name}Client 
{ 
    #set($year = $package.getClass().forName("java.util.Date").newInstance().getYear() + 1900) 
    #set($name = $package.getClass().forName("com.jh.interfaces.VideoPlayerInterface").getSimpleName()) 

    public void ${name}${year}(){} 
} 

$ {année} contient l'année en cours (il fonctionne très bien), mais {name} $ échoue lors de la création de projet archétype Maven:

generate (default-cli) on project standalone-pom: org.apache.maven.archetype.exception.ArchetypeGenerationFailure: Error merging velocity templates: Invocation of method 'forName' in class java.lang.Class threw exception java.lang.ClassNotFoundException: com.jh.interfaces.VideoPlayerInterface at archetype-resources/src/main/java/__library-name__Client.java[line 10, column 39] 

Quelqu'un at-il connu un problème similaire? Merci

Répondre

0

Une approche facile:

Utilisez le reflation des choses liées dans le code Java, obtenir les méthodes déclarées et ajouter tableau méthodes/liste dans le contexte de la vitesse.

String sourceClassName = "com.jh.interfaces.VideoPlayerInterface"; 
try { 
    Class sourceClass = Class.forName(sourceClassName); 
    Method[] methods = (Method[]) ArrayUtils.addAll(methods, sourceClass.getDeclaredMethods()); 
    context.put("methods", methods); 
} catch (ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 

Ensuite, vous pouvez écrire quelque chose comme votre modèle ceci:

package com.jh.impl; 
public class VideoPlayerCustom implements VideoPlayerInterface { 
    #foreach ($method in $methods) 
     public void $method.getName()(){} 
    #end 
} 
+0

Bonjour, merci pour votre réponse. Je suis un débutant complet avec l'archétype, où dois-je attacher ce code Java? Jusqu'à présent, je pouvais juste créer un fichier en fonction d'une valeur d'attribut. – pablogdt