開(kāi)心一笑
上課呢拓萌,同桌撕了一片紙放嘴里了咬了咬,又吐回了手里升略。
揉了揉微王,揉成個(gè)球狀,然后又把這東西給放嘴里品嚣,咽下去了炕倘。
我問(wèn):你干嘛呢?
這二貨幽幽地說(shuō):這兩天有點(diǎn)感冒翰撑,捏個(gè)藥丸吃罩旋。
提出問(wèn)題
Java動(dòng)態(tài)代理類實(shí)現(xiàn)簡(jiǎn)單的日志
解決問(wèn)題
假如你已經(jīng)有一定的java基礎(chǔ)
假如你已經(jīng)知道什么是動(dòng)態(tài)代理。
1.假如下面是真實(shí)的業(yè)務(wù)類及其實(shí)現(xiàn)類
package com.hwy.test;
/**
* Created by Ay on 2016/7/1.
*/
public interface BusinessClassService {
public void doSomeThing();
}
實(shí)現(xiàn)類:
package com.hwy.test;
/**
* 業(yè)務(wù)類
* Created by Ay on 2016/7/1.
*/
public class BusinessClassServiceImpl implements BusinessClassService{
/** 執(zhí)行某事 **/
public void doSomeThing(){
System.out.println("do something ......");
}
}
2.下面是日志類和實(shí)現(xiàn)類:
package com.hwy.test;
import java.lang.reflect.Method;
/**
* 日志類接口
* Created by Ay on 2016/6/30.
*/
public interface MyLogger {
/** 紀(jì)錄進(jìn)入方法時(shí)間 **/
public void saveIntoMethodTime(Method method);
/** 紀(jì)錄退出方法時(shí)間**/
public void saveOutMethodTime(Method method);
}
實(shí)現(xiàn)類:
package com.hwy.test;
import java.lang.reflect.Method;
/**
* 日志類實(shí)現(xiàn)
* Created by Ay on 2016/6/30.
*/
public class MyLoggerImpl implements MyLogger {
@Override
public void saveIntoMethodTime(Method method) {
System.out.println("進(jìn)入" + method.getName() +"方法時(shí)間為: " + System.currentTimeMillis());
}
@Override
public void saveOutMethodTime(Method method) {
System.out.println("退出" + method.getName() + "方法時(shí)間為:" + System.currentTimeMillis());
}
}
3.下面是日志類的handler實(shí)現(xiàn):
package com.hwy.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by Ay on 2016/6/30.
*/
public class MyLoggerHandler implements InvocationHandler {
/** 原始對(duì)象 **/
private Object objOriginal;
/** 這里很關(guān)鍵 **/
private MyLogger myLogger = new MyLoggerImpl();
public MyLoggerHandler(Object obj){
super();
this.objOriginal = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
/** 日志類的方法 **/
myLogger.saveIntoMethodTime(method);
/** 調(diào)用代理類方法 **/
result = method.invoke(this.objOriginal ,args);
/** 日志類方法**/
myLogger.saveOutMethodTime(method);
return result;
}
}
4.最后是測(cè)試類:
package com.hwy.test;
import java.lang.reflect.Proxy;
/**
* Created by A on 2016/6/30.
*/
public class MyLoggerTest {
public static void main(String[] args) {
/** 實(shí)例化真實(shí)項(xiàng)目中業(yè)務(wù)類 **/
BusinessClassService businessClassService = new BusinessClassServiceImpl();
/** 日志類的handler **/
MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);
/** 獲得代理類對(duì)象 **/
BusinessClassService businessClass = (BusinessClassService)Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);
/** 執(zhí)行代理類方法 **/
businessClass.doSomeThing();
}
}
5.運(yùn)行MyLoggerTest類
進(jìn)入doSomeThing方法時(shí)間為: 1467326179684
do something ......
退出doSomeThing方法時(shí)間為:1467326179685
6.嘮叨幾句:
1)上面類中眶诈,類的初始化涨醋,基本可以利用spring配置到配置文件中
2)上面只是一個(gè)簡(jiǎn)單的例子而已
300252414810452387.jpg
讀書感悟
來(lái)自《老男孩》
- 笑,全世界都陪你笑逝撬;哭浴骂,只有你一個(gè)人流淚。
- 回答錯(cuò)了問(wèn)題并不可怕宪潮,可怕的是問(wèn)錯(cuò)了問(wèn)題靠闭,那就永遠(yuǎn)得不到正確的答案
- 只剩下麻木的我沒(méi)有了當(dāng)年的熱血。
- 不管是沙還是石頭坎炼,都會(huì)沉下去。