容易实现Struts2拦截器功能的模拟代码
简单实现Struts2拦截器功能的模拟代码
TargerInterface:(目标接口,定义方法)
package com.interceptor; public interface TargerInterface { public void doSomething(); }
Target:(目标类,实现方法)
package com.interceptor; public class Target implements TargerInterface { public void doSomething() { System.out.println("do something in Target class..."); } }Interceptor:(拦截器类,写拦截前后需要处理的方法)
package com.interceptor; public class Interceptor { public void before(){ System.out.println("before..."); } public void after(){ System.out.println("after..."); } }MyHandler:(反射处理,将目标和拦截关联起来,这里开始耦合)
package com.interceptor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyHandler implements InvocationHandler { private Object object; private Interceptor interceptor = new Interceptor(); public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; interceptor.before(); result = method.invoke(object, args); interceptor.after(); return result; } public void setObject(Object object) { this.object = object; } }MyProxy:(代理类,实现反射加载)
package com.interceptor; import java.lang.reflect.Proxy; public class MyProxy { public Object getProxy(Object object){ MyHandler myHandler = new MyHandler(); myHandler.setObject(object); return Proxy.newProxyInstance(Target.class.getClassLoader(), object.getClass().getInterfaces(), myHandler); } }Client:(测试类)
package com.interceptor; public class Client { public static void main(String[] args) { TargerInterface target = new Target(); MyProxy myProxy = new MyProxy(); TargerInterface proxy = (TargerInterface)myProxy.getProxy(target); proxy.doSomething(); } }
注意分析每个类之间的关系,理解反射与代理