2016-09-14 16 views
1

私のサーブレットには、ロード時に開始されたオブジェクトBがあります。オブジェクトBの初期化は、次のような静的ブロック内にあります。サーブレットフィルタの静的ブロック内で開始される静的クラスのインスタンスを取得するにはどうすればよいですか?

FilterA implements Filter{ 
    private static B b = new B(); 
    static {b.setText("This is B");} 
    doFilter(){...} 
} 

class B{ 
    private String text; 
    public void setText(String s){ 
     this.text=s; 
    } 
    public String getText(){ 
     return this.text; 
    } 
} 

ここで、FilterAはweb.xmlで定義されているサーブレットフィルタです。

私がやっていることは、オブジェクトBを変更するための新しいサーブレットフィルタ(filterB)を書くことです。filterBは、以下のようにweb.xmlのfilterAの直後に配置されます。この方法は、それを取得するために採用することができますどのようリフレクションは、私はクラスBのインスタンスを取得するには、フィルタBで使用できる唯一のソリューションです考える

<filter> 
    <filter-name>filterA</filter-name> 
    <filter-class>my.FilterA</filter-class> 
</filter> 
<filter> 
    <filter-name>filterB</filter-name> 
    <filter-class>my.FilterB</filter-class> 
</filter> 

はありますか?

クラスBの新しいインスタンスを作成せず、既存のインスタンスのみを取得するため、Class.forName()はこのケースには適していないと思います。

//新しいものは、私はケースをシミュレートするために、簡単なテストクラスを書いています、ここ

を行きます。ポイントとして、以下のコードを取ってください:

package com.jm.test; 

public class AIAItest { 

    private static BB bb = new BB(); 

    static{ 
     bb.setText("sb"); 
    } 

    public static void main(String[] args){ 
     try { 

      //TODO use reflection to get the instance of BB, is it possible? 
      //do not simply refer to bb 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 
} 

class BB{ 
    private String text; 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

} 
+1

私はJavaサーブレットに慣れていませんが、FilterA.bを実行するだけでクラスBにアクセスできるはずです。 – Himself12794

+0

FilterAのソースを変更できますか? – Bohemian

+0

実際にはcuz FilterAはサードパーティによって提供されるJARに組み込まれています... –

答えて

0

bはそれへの直接の静的参照は動作するはずです、FilterApublicstaticであることを考えます。あなたはリフレクションを使用して、それをコーディングする方法を求めている場合はFilterBでは、このコードは

B b = FilterA.b; 
+0

です。それを私の間違いで公開しましたが、それは実際に私的でなければなりません。だから、私は反射の解決策について考えているのです。 –

1

を動作するはずです、主なポイントは以下のとおりです。静的フィールドの

  • 、フィールドに必要な一切のインスタンスがありません。 get()メソッド
  • あなたが公共の場このよう

行う必要があります。

+0

thx。これはまさに私が欲しいものです... :) –

関連する問題