杂七杂八
获取类属性
获取类属性有两种方式
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。getDeclaredFields():获得某个类的所有声明(public、private、proteced)的字段,但是不包括父类的申明字段。
public class TestFields {
@Test
public void testFields() {
Person person = new BoyStudent();
Arrays.stream(person.getClass().getFields()).forEach(field -> System.out.println("testFields:"+field.getName()));
Arrays.stream(person.getClass().getDeclaredFields()).forEach(field -> System.out.println("testDeclaredFields:"+field.getName()));
}
class Person {
public String Id;
private String username;
private String grade;
}
class Student extends Person {
private String sex;
}
class BoyStudent extends Student {
private String color;
}
}
测试结果:
testFields:Id
testDeclaredFields:color
testDeclaredFields:this$0
获取全部属性
通过getDeclaredFields()方法获取当前类的所有属性(私有属性、保护属性和公共属性)。然后,递归父类的属性。
public class TestDeclaredFields {
@Test
public void test() {
Field[] fields = getAllFields(new BoyStudent());
Arrays.stream(fields)
.distinct()
.filter(f -> f.getName().equals("username"))
.findFirst()
.ifPresent(field -> System.out.println("final:"+field.getName()));
}
public Field[] getAllFields(Object object) {
Class<?> clazz = object.getClass();
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
Arrays.stream(fieldList.toArray(fields)).forEach(f-> System.out.println("fields: "+f.getName()));
return fields;
}
class Person {
private String username;
private String grade;
}
class Student extends Person {
private String sex;
}
class BoyStudent extends Student {
private String color;
}
}
测试结果:
fields: color
fields: this$0
fields: sex
fields: this$0
fields: Id
fields: username
fields: grade
fields: this$0
final:username
