私のサーブレットには、ロード時に開始されたオブジェクト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;
}
}
私はJavaサーブレットに慣れていませんが、FilterA.bを実行するだけでクラスBにアクセスできるはずです。 – Himself12794
FilterAのソースを変更できますか? – Bohemian
実際にはcuz FilterAはサードパーティによって提供されるJARに組み込まれています... –