在我的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;
}
}
答案 0 :(得分:1)
如果您正在询问如何使用反射对其进行编码,则要点是:
像这样:
Field f = AIAItest.class.getField("bb");
f.setAccessible(true); // effectively make it public
BB bb = (BB)f.get(null);
答案 1 :(得分:0)