如何获取在servlet过滤器中的静态块内启动的静态类的实例?

时间:2016-09-14 14:01:00

标签: java servlets reflection

在我的Servlet中,在加载时启动了一个对象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中定义的Servlet过滤器。

我正在做的是编写一个新的Servlet过滤器(filterB)来修改对象B. filterB就位于web.xml中的filterA之后,如下所示。

<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>

鉴于Reflection是唯一可以在过滤器B中使用来检索B类实例的解决方案。是否可以采用任何方法来检索它?

我不认为Class.forName()适用于这种情况,因为我不打算创建任何B类的新实例,而只是检索现有实例。

//新事物在这里

我正在编写一个简单的测试类来模拟案例。请将以下代码作为要点:

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

}

2 个答案:

答案 0 :(得分:1)

如果您正在询问如何使用反射对其进行编码,则要点是:

  • 对于静态字段,Field.get()方法
  • 不需要实例
  • 您必须将字段公开

像这样:

Field f = AIAItest.class.getField("bb");
f.setAccessible(true); // effectively make it public
BB bb = (BB)f.get(null);

答案 1 :(得分:0)

鉴于在FilterA中b是公共的和静态的,对它的直接静态引用应该有效。在FilterB中,此代码应该有效 B b = FilterA.b;