2017-08-02 7 views
0

私は完全な初心者ですが、私はこの質問をする前に多くの投稿を読んでいます。私は(私が作成した)インタフェースで定義された構造、次の新しいプロジェクトをビルドするためのテンプレートを作成したい:私のクラスのメソッド名を使用して、mavenのアーキタイプを作成するためのリフレクションを使用します。

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

私はそのメソッドをオーバーライドするクラスを作成したいと思い、このような何か:

package com.jh.impl; 
public class VideoPlayerCustom implements VideoPlayerInterface { 
    public void play(){} 
    public void pause(){} 
    public void rewind(){} 
    public void stop(){} 
    public void fastFordward(){} 
} 
そうするためには

は、私は、Javaクラスと同様のものを行うためにリフレクションを使用SOのトピックを見つけましたが、私は起動にも、簡単な操作で自分のインタフェースを使用して結果を取得することができませんでした:

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}(){} 
} 

$ {年}(それが正常に動作します)現在の年が含まれますが、Maven原型からプロジェクトを作成するときに$ {name}は失敗します。

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] 

誰でも同様の問題を経験してきましたか? おかげ

答えて

0

簡単なアプローチ:

は、Javaコードでリフレ関連のものを使用して宣言されたメソッドを取得し、速度コンテキストにメソッド配列/リストを追加します。

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

こんにちは、お返事に感謝:

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(); } 

次に、あなたはこのようなテンプレートの何かを書くことができます。私は原型の完全な初心者ですが、そのJavaコードはどこに付けるべきですか?これまでは、属性値に応じてファイルを作成できました。 – pablogdt

関連する問題