package com.example.demo.main;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
/**
* 提供公共实现类
*
* @param <O>
*/
public class T {
/**
* 检查 tableModels 内部 的bean
*
* @param e1
* @return
*/
protected void lookAtBean(Class clazz) {
try {
/**
* 获取所有字段名
*/
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
String fname = f.getName();
if (f.getType() != List.class) {
continue;
}
//获取 孩子类型
Class actualTypeArgument = getClassOfListPropertyInBean(f);
System.out.println("|----探索["+clazz.getSimpleName()+"]的子类List[" + actualTypeArgument.getSimpleName() + "]类型>>" + fname);
}
}catch (Throwable throwable){
System.err.println("no boring!");
}
}
/**
* 获取 Bean 中 List<T> 中 的 T class 类型
* @param f
* @return
*/
public static Class<?> getClassOfListPropertyInBean(Field f) {
if (f.getType() != List.class) {
System.err.println("Field is not List");
return null;
}
Type genericType = f.getGenericType();
if (genericType == null) {
System.err.println("genericType is null");
return null;
}
if (!(genericType instanceof ParameterizedType)) {
System.err.println("genericType instanceof ParameterizedType is false");
return null;
}
ParameterizedType pt = (ParameterizedType) genericType;
//得到泛型里的class 类型对象
Class<?> actualTypeArgument = (Class<?>) pt.getActualTypeArguments()[0];
return actualTypeArgument;
}
/**
* 获取 entity 的表名注解值
* 比如 有个 entity 上有个 mybatis 注解 @TableName("sys_user") 或 TableName(value="sys_user")
* 你想动态获取 bean 的 @TableName 注解里面的值( "sys_user" ),即可用这个方法
* @param clazz
* @return
*/
public final static String getTableNameOfEntity(Class<?> clazz) {
// Class<BMXX> clazz = BMXX.class;
if (!clazz.isAnnotationPresent(MyTableName.class)) {
return null;
}
MyTableName annotation = clazz.getAnnotation(MyTableName.class);
//annotation.value() 是因为 @TableName 定义里有 value()/required() 函数;故这里需要具体情况处理
String v = annotation.value();
boolean required = annotation.required();
return v;
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTableName{
String value() default "";
boolean required() default false;
}
}
08-20
428
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)