JAVA反射相关

1、通过反射获取到类中的所有属性列表

Class cla = entityName.getClass();
Field field[] = cla.getDeclaredFields();

2、获取对象类型的值

public static Object getProperty(Object entityName) throws Exception {
for (int i = 0; i < field.length; i++) {
Field f = field[i];
if(f.getName().indexOf("Service") > 0){
f.setAccessible(true);//设置允许访问,不设置的话,属性值为private等就不能获取到值
return f.get(entityName);//这里返回的是一个service对象,接受到后就能调用里面的方法
}
}
}


package com.mobile.core;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.doone.mobile.controller.WebContextUtils;
import com.doone.mobile.service.base.BaseService;
import com.doone.mobile.tools.UtilString;

/**
* 根日志轨迹.
* 通过AOP能力,将所有方法调用情况输入到根日志器.
* 输出到控制台.
* @ClassName: RootLogTrack
*/
@Component
@Aspect
public class RootLogTrack {

@Resource
private WebContextUtils webContextUtils;

/**
*
* 配置外部接口层切入点.
* 切入点匹配表达式com.doone.mobile.controller..*
* 匹配包名为com.doone.mobile.controller及子包
*/
@Pointcut("within(com.doone.mobile.controller..*)")
public void controllerPointcut() {
}

/**
*
* TODO(配置外部接口层切入点.
* 切入点匹配表达式com.doone.mobile.controller..*
* 匹配包名为com.doone.mobile.controller及子包).
* @author Johnny_L_Q
*/
@Pointcut(value = "execution(* com.doone.mobile.controller..*.save*(..))")
public void controllerSavePointcut(){}

/**
*
* TODO(配置外部接口层切入点.
* 切入点匹配表达式com.doone.mobile.controller..*
* 匹配包名为com.doone.mobile.controller及子包).
* @author Johnny_L_Q
*/
@Pointcut(value = "execution(* com.doone.mobile.controller..*.delete*(..))")
public void controllerDeletePointcut(){}

/**
*
* 方法调用前通过日志纪录类名,方法名和参数值.
* @param jp JoinPoint
*/
@Before("controllerPointcut()")
public void methodInvokedBefore(JoinPoint jp) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
logger.info(jp.toString());
StringBuilder builder = new StringBuilder();
Object[] args = jp.getArgs();
if (args.length > 0) {
builder.append("arguments:");
}
for (Object arg : args) {
builder.append(arg).append(",");
}
if (args.length > 0) {
builder.deleteCharAt(builder.length() - 1);
}
logger.info(builder.toString());
}

/**
*
* controller中save方法调用前通过日志纪录类名,方法名和参数值.
* @param jp JoinPoint
* @author Johnny_L_Q
*/
@Before("controllerSavePointcut()")
public void saveMethodInvokedBefore(JoinPoint jp) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
StringBuilder builder = new StringBuilder();
builder.append("用户:" + webContextUtils.getUser().getUserName() + ",在时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ",对类" + jp.toString() + ",进行了保存操作,具体参数如下:");
Object[] args = jp.getArgs();
if (args.length > 0) {
if(args[0] instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest) args[0];
Enumeration<String> obj = request.getParameterNames();
Map<String,Object> map = request.getParameterMap();
//循环遍历所有参数值,并记录到日志中
while (obj.hasMoreElements()) {
String key = (String) obj.nextElement();
Object object = ((String[])map.get(key))[0];
String value = null;
if(object instanceof Long){
System.out.println("Long");
value = ((Long) object).toString();
}else if(object instanceof Integer){
System.out.println("Integer");
value = ((Integer) object).toString();
}else if(object instanceof String){
System.out.println("String");
value = (String) object;
}
builder.append("'" + key).append("':").append("'" + value).append("',");
}
}else{
for (Object arg : args) {
builder.append(arg).append(",");
}
}
}

if (args.length > 0) {
builder.deleteCharAt(builder.length() - 1);
}
logger.info(builder.toString());
}

/**
*
* TODO(controller执行删除前获取即将删除的id值).
* @param request
* @author Johnny_L_Q
* @return
*/
public String getRequestId(HttpServletRequest request){
Enumeration<String> obj = request.getParameterNames();
Map<String,Object> map = request.getParameterMap();
while (obj.hasMoreElements()) {
String key = (String) obj.nextElement();
//判断字段名中是否含有Id或者是id,如果有则返回该值
if(key.indexOf("id") > 0 || key.indexOf("Id") > 0){
Object object = ((String[])map.get(key))[0];
String value = null;
if(object instanceof Long){
value = ((Long) object).toString();
}else if(object instanceof Integer){
value = ((Integer) object).toString();
}else if(object instanceof String){
value = (String) object;
}
return value;
}
}
return null;
}

/**
*
* 方法调用前通过日志纪录类名,方法名和参数值.
* @param jp JoinPoint
* @author Johnny_L_Q
*/
@Before("controllerDeletePointcut()")
public void deleteMethodInvokedBefore(JoinPoint jp) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
StringBuilder builder = new StringBuilder();
builder.append("用户:" + webContextUtils.getUser().getUserName() + ",在时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ",对" + jp.toString() + ",进行了删除操作,删除的数据内容如下:");
Object[] args = jp.getArgs();
try {
if (args.length > 0) {
//获得类中的service属性值
BaseService service = (BaseService) getProperty(jp.getTarget());
String id = null;
if(args[0] instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest) args[0];
//获取参数ID
id = getRequestId(request);
}

if(!UtilString.isEmpty(id) && null != service){
//查询出即将删除的实体
Object obj = service.findEntityById(Long.parseLong(id));
builder.append(obj.toString());
}else{
System.out.println("id is null");
}
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info(builder.toString());
}


/**
* 获得一个对象各个属性的字节流
*/
@SuppressWarnings("unchecked")
public static Object getProperty(Object entityName) throws Exception {
Class c = entityName.getClass();
Field field[] = c.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
Field f = field[i];
if(f.getName().indexOf("Service") > 0){
f.setAccessible(true);
return f.get(entityName);
}
//System.out.println("---------- " + f.getName() + "\t" + "=========" + "\t" + f.getType());
}
return null;
}


/**
*
* 方法调用后通过日志纪录返回值.
* @param jp JoinPoint
* @param retVal 返回值
*/
@AfterReturning(pointcut = "controllerPointcut()", returning = "retVal")
public void methodInvokedAfter(JoinPoint jp, Object retVal) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
StringBuilder builder = new StringBuilder();
builder.append("return:");
builder.append(retVal);
logger.info(builder.toString());
}

/**
*
* 方法调用产生异常时,通过日志纪录异常.
* @param jp JoinPoint
* @param ex Exception
*/
@AfterThrowing(pointcut = "controllerPointcut()", throwing = "ex")
public void methodInvokedThrowException(JoinPoint jp, Exception ex) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
StringBuilder builder = new StringBuilder();
builder.append("exception:");
builder.append(ex.getClass().getSimpleName());
builder.append(ex.getMessage());
logger.error(builder.toString());
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值