获取调用者Class和method、反射获取get方法、获取注解信息

调用者Class 及 method

StackTraceElement stacks[] = Thread.currentThread().getStackTrace();
for (StackTraceElement stack : stacks) {
String className = stack.getClassName();
if (className.contains("com.upsoft")
&& className.contains("Controller")) {
className = className.substring(className.lastIndexOf(".") + 1,
className.length());
String methodName = stack.getMethodName();
}
}

反射(get)

// 通过反射 遍历实体所有属性,找出发生改变的字段及修改前和修改后的值
Field[] fields = entity.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) { changeColumn = new ColumnChangeBean();
String attrName = fields[i].getName();
Class<?> attrType = fields[i].getType();
Method method = getGetMethod(entity.getClass(), attrName); try { Object oldValue = null;
Object newValue = null; // 通过反射获取 oldValue 和 newValue 的值
if (oldEntity != null) {
oldValue = method.invoke(oldEntity, new Object[0]);
}
newValue = method.invoke(entity, new Object[0]); } catch (Exception e) {
e.printStackTrace();
}
}
    private Method getGetMethod(Class objectClass, String fieldName) {
StringBuffer sb = new StringBuffer();
sb.append("get");
sb.append(fieldName.substring(0, 1).toUpperCase());
sb.append(fieldName.substring(1));
try {
return objectClass.getMethod(sb.toString());
} catch (Exception e) {
}
return null;
}

反射(set)

public static void invokeSet(Object o, String fieldName, Object value) {       

    Method method = getSetMethod(o.getClass(), fieldName);       

    try {       

        method.invoke(o, new Object[] { value });       

    } catch (Exception e) {       

        e.printStackTrace();       

    }       

}

public static Method getSetMethod(Class objectClass, String fieldName) {       

    try {       

        Class[] parameterTypes = new Class[1];       

        Field field = objectClass.getDeclaredField(fieldName);       

        parameterTypes[0] = field.getType();       

        StringBuffer sb = new StringBuffer();       

        sb.append("set");       

        sb.append(fieldName.substring(0, 1).toUpperCase());       

        sb.append(fieldName.substring(1));       

        Method method = objectClass.getMethod(sb.toString(), parameterTypes);       

        return method;       

    } catch (Exception e) {       

        e.printStackTrace();       

    }       

    return null;       

} 

获取类注解信息

Annotation[] annotations = entity.getClass().getAnnotations();
for (int i = 0; i < annotations.length; i++) {
String annoStr = annotations[i].toString();
if (annoStr.contains("@javax.persistence.Table")) {
annoStr = annoStr.substring(annoStr.lastIndexOf("name=") + 5);
while (annoStr.contains(",")) {
annoStr = annoStr.substring(0, annoStr.lastIndexOf(","));
}
tableName = annoStr;
}
}

获取方法、属性注解

Field[] fields = entity.getClass().getDeclaredFields();

        // 遍历Bean属性
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String attrName = field.getName();
// 获取属性对应的get方法
Method method = getGetMethod(entity.getClass(), attrName); Annotation[] attrAnnotations = field.getAnnotations();
Annotation[] methodAnnotations = method.getAnnotations(); }
上一篇:java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】


下一篇:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。