Java之动态代理类实现日志简单实例
2016-07-01 本文已影响173人
阿_毅
开心一笑
上课呢,同桌撕了一片纸放嘴里了咬了咬,又吐回了手里。
揉了揉,揉成个球状,然后又把这东西给放嘴里,咽下去了。
我问:你干嘛呢?
这二货幽幽地说:这两天有点感冒,捏个药丸吃。
提出问题
Java动态代理类实现简单的日志
解决问题
假如你已经有一定的java基础
假如你已经知道什么是动态代理。
1.假如下面是真实的业务类及其实现类
package com.hwy.test;
/**
* Created by Ay on 2016/7/1.
*/
public interface BusinessClassService {
public void doSomeThing();
}
实现类:
package com.hwy.test;
/**
* 业务类
* Created by Ay on 2016/7/1.
*/
public class BusinessClassServiceImpl implements BusinessClassService{
/** 执行某事 **/
public void doSomeThing(){
System.out.println("do something ......");
}
}
2.下面是日志类和实现类:
package com.hwy.test;
import java.lang.reflect.Method;
/**
* 日志类接口
* Created by Ay on 2016/6/30.
*/
public interface MyLogger {
/** 纪录进入方法时间 **/
public void saveIntoMethodTime(Method method);
/** 纪录退出方法时间**/
public void saveOutMethodTime(Method method);
}
实现类:
package com.hwy.test;
import java.lang.reflect.Method;
/**
* 日志类实现
* Created by Ay on 2016/6/30.
*/
public class MyLoggerImpl implements MyLogger {
@Override
public void saveIntoMethodTime(Method method) {
System.out.println("进入" + method.getName() +"方法时间为: " + System.currentTimeMillis());
}
@Override
public void saveOutMethodTime(Method method) {
System.out.println("退出" + method.getName() + "方法时间为:" + System.currentTimeMillis());
}
}
3.下面是日志类的handler实现:
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 {
/** 原始对象 **/
private Object objOriginal;
/** 这里很关键 **/
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);
/** 调用代理类方法 **/
result = method.invoke(this.objOriginal ,args);
/** 日志类方法**/
myLogger.saveOutMethodTime(method);
return result;
}
}
4.最后是测试类:
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) {
/** 实例化真实项目中业务类 **/
BusinessClassService businessClassService = new BusinessClassServiceImpl();
/** 日志类的handler **/
MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);
/** 获得代理类对象 **/
BusinessClassService businessClass = (BusinessClassService)Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);
/** 执行代理类方法 **/
businessClass.doSomeThing();
}
}
5.运行MyLoggerTest类
进入doSomeThing方法时间为: 1467326179684
do something ......
退出doSomeThing方法时间为:1467326179685
6.唠叨几句:
1)上面类中,类的初始化,基本可以利用spring配置到配置文件中
2)上面只是一个简单的例子而已
300252414810452387.jpg
读书感悟
来自《老男孩》
- 笑,全世界都陪你笑;哭,只有你一个人流泪。
- 回答错了问题并不可怕,可怕的是问错了问题,那就永远得不到正确的答案
- 只剩下麻木的我没有了当年的热血。
- 不管是沙还是石头,都会沉下去。