private static <T> void reflect_test(Object o, Class<T> oClass) throws Exception {
//将o转换为oClass类型
T cast = oClass.cast(o);
//获取类名
String typeName = cast.getClass().getTypeName();
//通过反射加载类数据
Class<?> aClass = Class.forName(typeName);
//获取类中所有方法
Method[] methods = aClass.getMethods();
//获取类中指定名称的方法
Method classMethod = aClass.getMethod("指定方法名称");
//获取类中指定名称,参数类型的方法
Method aClassMethod = aClass.getMethod("指定方法名称", Integer.class);
//获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field[] fields = aClass.getFields();
//获得某个类的指定名称的公共(public)的字段,包括父类中的字段。
aClass.getField("指定属性名称");
//获取类中public、private和proteced修饰的字段,但是不包括父类的声明的字段
Field[] declaredFields = aClass.getDeclaredFields();
//获取类中指定名称的被public、private和proteced修饰的字段,但是不包括父类的声明的字段
Field declaredField = aClass.getDeclaredField("指定属性名称");
//获取类中全部被public、private和proteced修饰的字段,包含父类的字段
List<Field> fieldList = new ArrayList<>();
while(aClass != null){
fieldList.addAll(Arrays.asList(aClass.getDeclaredFields()));
//递归
aClass = aClass.getSuperclass();
}
//为属性赋值
for(Field field : fieldList){
if(("xxx").equals(field.getName())){
//如果此属性为非public属性的情况时,需要设置属性可达,否则会抛出IllegalAccessException异常
field.setAccessible(true);
//赋值
field.set(field.getName(),"属性值");
//获取属性值
field.get(field.getName());
}
}
//赋值的时候如果为Integer赋值会出现异常,所以我们可以通过调用set方法的形式为Integer等类
//型的对象进行赋值
//例如第一个方法(methods[0])为Integer类型的属性的set方法,将其设置为100
methods[0].invoke(aClass,100);
}
Java反射小记(基本使用方式、泛型、为Integer类型属性赋值)
猜你喜欢
转载自blog.csdn.net/Peacock__/article/details/88825151
今日推荐
周排行