2012-04-24 5 views
2

おはようございます 同じ名前を持つ2つのメソッドを持つ抽象Javaクラスを拡張しようとしています。しかし、それらのうちの1つだけを検証する必要があります。ここでJRuby:同じ名前の2つのメソッドを持つJavaクラスを拡張します

は私のJavaコードは次のとおりです。私は「JAVA_METHOD」を使用しようとすると、ここで

public abstract class ClientHandler extends Handler implements SOAPHandler<SOAPMessageContext> { 
    protected boolean disable = true; 
    protected X509Certificate signatureCertificate; 
    protected PrivateKey privateKey; 
    protected Certificate[] signatureCertificationChain; 

    //Constructeur 
    protected ClientHandler(boolean disable) { 
     this.disable = disable; 
    } 

    private boolean handleMessage(VIHF vihf) { 
     //This is the beginning of the method i am trying to redefine 
     X509Certificate certificate = this.signatureCertificate 
     String issuer = certificate.getSubjectDN().toString(); 
     //some code 
     ... 
    } 

    public boolean handleMessage(SOAPMessageContext smc) { 
     //some code 
    } 
    } 

は私のJRubyのコードが

ある
#To make parent attributes accessible from subclasses 
class ClientHandler 
    field_accessor :disable, :signatureCertificate, :privateKey, :signatureCertificationChain 
end 

#first version referring to that post: <http://stackoverflow.com/questions/6238734/jruby-calls- the-wrong-method> 

module RubyClientHandler 
    class RClientHandler < ClientHandler 
    handleMessage = ClientHandler.java_method :handleMessage, java.lang.Class.for_name(Java::ComSubFolder::VIHF)] 

    def handleMessage(vihf) 
     super(self.disableSignature) #is this line ok or note? 

     certificate = self.signatureCertificate #do i need to use the "self" or the "@" ? 
     issuer = certificate.getSubjectDN().toString() 
     ... 
    end 
    end 
end 

私の最初のバージョンでは、私は次のエラーを取得しています: "Java :: JavaLang :: Classの引数(org.jruby.RubyModule)のメソッド 'forName'がありません

次に、この2番目のRClientHandlerクラスを試しました

第二版:その記事を参照:http://www.ruby-forum.com/topic/216636

module RubyClientHandler 
    class RClientHandler < ClientHandler 
    def handleMessage(vihf) 
     super   #line causing the error 
     klass = vihf.class 

     if(klass.eql?(Java::ComSubFolder::VIHF)) 
      self.java_send :handleMessage,[VIHF], vihf 

      certificate = self.signatureCertificate 
      issuer = certificate.getSubjectDN().toString() 
      ... 
     end 
    end 
    end 
end 

私は「のhandleMessage」の最初の行を指している、次の例外を取得していますこの第二のバージョンで

HANDLER_RAISED_RUNTIME_EXCEPTION 
org.jruby.exceptions.RaiseException: Native Exception: 'class java.lang.StackOverflowError';  Message: null; StackTrace: java.lang.StackOverflowError 
at org.jruby.proxy.com.sub.folder.ClientHandler$Proxy0.__super$handleMessage(Unknown Source) 

は、これは、親クラスのコンストラクタまたは親の "handleMessage"メソッドを呼び出す "super"の行? 親クラスのコンストラクタに従ってここで "super"を呼び出すときに何らかの引数が必要ですか?

JRubyで "handleMessage"メソッドを1つ(または2つ)だけオーバーライドすることで、この "ClientHandler"クラスを拡張する方法を教えてください。 ご協力いただきありがとうございます。最初のバージョンで

答えて

1

、文字列としてのJavaクラスの名前を渡ししよう:

java.lang.Class.for_name('Java::ComSubFolder::VIHF') 

更新:それはJRubyの名前空間ですので、実際には、右、動作しないのだろうか?クラスへのJavaパスが必要です。

例:

> java.lang.Class.for_name('java.lang.StringBuffer') 
=> #<Java::JavaLang::Class:0x628d2280> 
> java.lang.Class.for_name('java.util.ArrayList') 
=> #<Java::JavaLang::Class:0x5057f57f> 
+0

私は文字列として私のクラスの名前を使用しようとしましたが、私は次のエラーを取得しています NativeException(にjava.lang.ClassNotFoundException:COM /サブ/フォルダ/ VIHF) : java/lang/Class.java:-2:forName0にあります。 java/lang/Class.java:169:forNameにあります。 – user1310635

+0

JavaコードはJRubyにどのように提供されていますか? jarファイルですか?もしそうなら、クラス通路にその瓶がありますか? –

関連する問題