获取类的名字

使用Class类的getName方法可以获取类的全限定名(包名+类名),使用getSimpleName方法则可以获取简单类名(不包括包名)

  1. package MyPackage_2;
  2. public class Test03 {
  3. public static void main(String[] args) {
  4. Person person=new Person();
  5. Class c1=person.getClass();
  6. //获取完整的类名
  7. String name=c1.getName();
  8. //获取简化的类名
  9. String simpleName= c1.getSimpleName();
  10. System.out.println(c1);
  11. System.out.println(name);
  12. System.out.println(simpleName);
  13. }
  14. }

运行结果:
image.png

获取类的属性

  • Field[] getFields():获取类中所有被public修饰的所有变量
  • Field getField(String name):根据变量名获取类中的一个变量,该变量必须被public修饰
  • Field[] getDeclaredFields():获取类中所有的变量,但无法获取继承下来的变量
  • Field getDeclaredField(String name):根据变量名获取类中的某个变量,无法获取继承下来的变量

    获取类的方法

  • Method[] getMethods():获取类中被public修饰的所有方法

  • Method getMethod(String name, Class…<?> paramTypes):根据名字和参数类型获取对应方法,该方法必须被public修饰
  • Method[] getDeclaredMethods():获取所有方法,但无法获取继承下来的方法
  • Method getDeclaredMethod(String name, Class…<?> paramTypes):根据名字和参数类型获取对应方法,无法获取继承下来的方法

    获取类的构造器

  • Constuctor[] getConstructors():获取类中所有被public修饰的构造器

  • Constructor getConstructor(Class…<?> paramTypes):根据参数类型获取类中某个构造器,该构造器必须被public修饰
  • Constructor[] getDeclaredConstructors():获取类中所有构造器
  • Constructor getDeclaredConstructor(class…<?> paramTypes):根据参数类型获取对应的构造器

    注意事项

    有Declared修饰的方法:可以获取该类内部包含的所有变量、方法和构造器,但无法获取继承来的信息
    无Declared修饰的方法:可以获取该类中public修饰的变量、方法和构造器,可获取继承下来的信息
    如: ```java public class Father { public String f_name; private String f_id;

}

  1. ```java
  2. public class Son extends Father{
  3. private String s_name;
  4. private String s_id;
  5. }
@Test
public void test() {
     Son son=new Son();
     Class<? extends Son> clazz = son.getClass();
     Field[] fields = clazz.getDeclaredFields();
     for (Field field : fields) {
         System.out.println(field);
     }
}

image.png

@Test
    public void test() {
        Son son=new Son();
        Class<? extends Son> clazz = son.getClass();
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }

image.png
可以看到getDeclaredFields获取了s_name和s_id,但是继承下来的属性没有一个获取到了;而getFields则没有获取到全部为private修饰的子类属性,反而是获取了继承下来的f_name(public修饰)属性。

getFields可以获取本类和父类的public属性,但不能获取private和protected的属性;getDeclaredFields可以获取本类所有的属性(包括private和protected),但无法获取父类的任何属性。因此无论使用哪种方法或者两者一起用也都无法获取包括继承下来的全部属性(public、protected、private)。因此我们只能子类使用getDeclaredFields,然后再父类使用getDeclaredFields,这样才能获取类的全部属性(包括继承的属性),而我们可以调用子类的Class类getSuperclass方法获取父类的Class,直到超类Object,如:

@SpringBootTest
class ApplicationTests {

    @Test
    public void test() {
        List<Field> fields = getFields(new Son());
        for (Field field : fields) {
            System.out.println(field);
        }
    }

    public static List<Field> getFields(Object obj) {
        if (obj == null) {
            return null;
        }
        Class<?> clazz = obj.getClass();
        List<Field> fields = new ArrayList<>();
        for (Class<?> c = clazz; c != Object.class; c = c.getSuperclass()) {
            fields.addAll(Arrays.asList(c.getDeclaredFields()));
        }
        return fields;
    }
}

image.png