本來想自己寫一個日志的,發現有位老兄寫的很好,我就不用費事,直接貼過來做筆記好了
。
==========================================================
[轉自:
http://publishblog.blogdriver.com/blog/tb.b?diaryID=842351
]
[Java]使用Proxy和InvocationHandler實現代理器模式
package com.zj.gof.proxy;
public interface StudentInfoService {
?void findInfo(String studentName);
}
package com.zj.gof.proxy;
public class StudentInfoServiceImpl implements StudentInfoService {
?public void findInfo(String name) {
??System.out.println("你目前輸入的名字是:" + name);
?}
}
package com.zj.gof.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.log4j.Logger;
public class LogHandler implements InvocationHandler {
? private Object proxyObj;
? private static Logger log=Logger.getLogger(LogHandler.class);
?
? public Object bind(Object obj){
?? this.proxyObj=obj;
?? return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
? }
?
? public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
?? Object result=null;
?? try{
??? //請在這里插入代碼,在方法前調用
??? log.info("調用log日志方法"+method.getName());
??? result=method.invoke(proxyObj,args); //原方法
??? //請在這里插入代碼,方法后調用
?? }catch(Exception e){
??? e.printStackTrace();
?? }
?? return result;
? }
}
注意:通過InvocationHandler接口實現的代理器只能代理接口方法.
(這點在InvocationHandler的注解中有說明)
package com.zj.gof.proxy;
public class LogFactory {
?private static Object getClassInstance(String clzName) {
??Object obj = null;
??try {
???Class cls = Class.forName(clzName);
???obj = (Object) cls.newInstance();
??} catch (ClassNotFoundException cnfe) {
???System.out.println("ClassNotFoundException:" + cnfe.getMessage());
??} catch (Exception e) {
???e.printStackTrace();
??}
??return obj;
?}
?public static Object getAOPProxyedObject(String clzName) {
??Object proxy = null;
??LogHandler handler = new LogHandler();
??Object obj = getClassInstance(clzName);
??if (obj != null) {
???proxy = handler.bind(obj);
??} else {
???System.out.println("Can't get the proxyobj");
???//throw
??}
??return proxy;
?}
}
package com.zj.gof.proxy;
public class MainTest {
?public static void main(String[] args) {
??//??PropertyConfigurator.configure("d:/log4j.properties");
??BasicConfigurator.configure();
??StudentInfoService studentInfo = (StudentInfoService) LogFactory
????.getAOPProxyedObject("com.zj.gof.proxy.StudentInfoServiceImpl");
??studentInfo.findInfo("阿飛");
?}
}
0 [main] INFO root? - 調用log日志方法findInfo
你目前輸入的名字是:阿飛