这就是接口的意义啊,你提供给它实现了什么类型的接口对象,调用者就知道去调用实现接口的方法。
但是我自己在本地实验发现我已经实现了接口的代码,但是子类也没有自动执行父类的方法啊。
@都督:
子类也没有自动执行父类的方法? 代码怎么写的,怎么配置的?
@向往-SONG:
public abstract interface Father {
public abstract void init();
public abstract void doFilter();
public abstract void destroy();
}
子类
package com.duqiao;
public class Son implements Father{
private String dien ;
public Son(String dien){
this.dien = dien;
}
public void destroy() {
System.out.println("destroy");
}
public void doFilter() {
System.out.println("doFilter--"+dien);
}
public void init() {
System.out.println("init");
}
public String getDien() {
return dien;
}
public void setDien(String dien) {
this.dien = dien;
}
public static void main(String[] args) {
Son s = new Son("123");
// s.doFilter();
}
}
这个还需要配置,怎么配置的呢
@都督:
--! 我以为你是写Struts Filter类,不是实现接口它就会自动执行接口方法啊。
会执行那是别的代码调用了接口方法。
如:
public void Test(Father f){
f.doFilter();
}
Son s = new Son("123");
Test(s);
此时doFilter就会自动执行(你所谓的自动执行其实是别的代码调用了接口的方法)。
@向往-SONG: 还的仔细问你一下,这个是
是struts2的源码 这个接口Filter的代码
public abstract interface Filter
{
public abstract void init(FilterConfig paramFilterConfig)
throws ServletException;
public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain)
throws IOException, ServletException;
public abstract void destroy();
}
这个是实现了接口的FilterDispatcher的
public class FilterDispatcher
implements StrutsStatics, Filter
{
private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);
private String[] pathPrefixes;
private final Calendar lastModifiedCal = Calendar.getInstance();
private static boolean serveStatic;
private static boolean serveStaticBrowserCache;
private static String encoding;
private static ActionMapper actionMapper;
private FilterConfig filterConfig;
protected Dispatcher dispatcher;
public void init(FilterConfig filterConfig)
throws ServletException
{
this.filterConfig = filterConfig;
this.dispatcher = createDispatcher(filterConfig);
this.dispatcher.init();
String param = filterConfig.getInitParameter("packages");
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
}
public void destroy()
{
if (this.dispatcher == null)
LOG.warn("something is seriously wrong, Dispatcher is not initialized (null) ");
else
this.dispatcher.cleanup();
}
这里的方法init和destroy 都没有别的代码调用啊(还是我没有看到)还请详细解释一下。不胜感激。
@都督:
你配置了FilerDispatcher相当于在web.xml里配置了servlet的Filter。都是由容器来调用的,你只要提供实现接口的类就行了。通过你的配置创建FilerDispatcher对象,并转换为Filter的接口类型,它就能调用实现类的方法了,类似:
Filter filter=(Filter)getInstance(配置...);
filter.doFilter();
@向往-SONG:
但是有的类我也没有配置啊,但是实现了Filter接口之后,他也自动执行了这个方法,这又怎么解释呢,比如public class ActionContextCleanUp
implements Filter
@都督:
那就是Struts自动查找你项目里所有实现了Filter接口的类调用的,总之是有个调用者找到对应接口的实现类去调用。
@向往-SONG: 可能是我太钻牛角尖了不过还是感谢你这么长时间,耐心地回答。谢谢。
第一句话喜欢,特熟悉,因为我最近也在看struts源码。这就是容器的强大之处。你理解了容器的概念,你就会懂的。那个Filter是配置在web.xml文件中的,启动Tomcat或别的服务器的时候,程序会读那个文件,然后就调用那个接口中的方法。也算是反射机制的一种运用。
你说的容器是servlet容器吗,我知道FilerDispatcher是配置到web.xml,filter是配置到那里了吗,我不知道这个是怎没配置的,程序读取了web.xml文件,他自动执行了从Filter接口中实现的三个方法,我就是想知道他为什么会自动执行,反射也要实现代码吧,还请详细解释一下。谢谢。
@都督: 其实上面那家伙已经回答很详细了,我没必要再补充了。
都是回调操作。什么叫自动调用,汗。
方法是不会自动执行的,如果要执行肯定是被调用了。不知道你有没有自定义过过滤器,比如解决乱码的过滤器或者控制权限的过滤器,那样对你理解过滤器的工作原理应该会有些帮助