Java中Class类的基本使用(反射)

1、获取类对象的几种方式

Class.forName(String name)类名.class实例对象.getClass()

private static void getClassDemo() throws Exception{
    Class cls1 = Class.forName("java.lang.Object");
    System.out.println(cls1);   // class java.lang.Object
    Class cls2 = Object.class;
    System.out.println(cls2);   // class java.lang.Object
    Object obj = new Object();
    Class cls3 = obj.getClass();
    System.out.println(cls3);   // class java.lang.Object
    System.out.println(cls1 == cls2);   // true
    System.out.println(cls1 == cls3);   // true
}

2、获取成员属性的四种方式

getFields()getField(String filedName)getDeclaredFields()getDeclaredFiled(String name)

  • 两组两种类型,前两个获取由public修饰的成员属性,获取所有及指定单个
  • 后两个是获取当前所有成员属性或指定某个成员属性
// 获取成员属性的方法
private static void getFiledsDemo() {
    Class<Person> cls = Person.class;
    // 获取public修饰的成员属性
    Field[] fields = cls.getFields();
    for (Field field : fields) {
        System.out.println(field);
    }
    System.out.println("------------");
    // 获取所有成员属性
    Field[] declaredFields = cls.getDeclaredFields();
    for (Field declaredField : declaredFields) {
        System.out.println(declaredField);
    }
}

3、获取构造方法的四种方式

  • getConstructors()getConstructor(Class<?>... parameterType) 获取public修饰的构造方法
  • getDeclaredConstructors()getDeclaredConstructor(class<?>... parameterTypes)获取所有构造方法
// 获取构造方法
private static void getConstructorsDemo() {
    Class<Person> cls = Person.class;
    // 获取所有public修饰的构造方法
    Constructor[] constructors = cls.getConstructors();
    for (Constructor constructor : constructors) {
        System.out.println(constructor);
    }
    System.out.println("----------------");
    // 获取所有构造方法
    Constructor[] declaredConstructors = cls.getDeclaredConstructors();
    for (Constructor declaredConstructor : declaredConstructors) {
        System.out.println(declaredConstructor);
    }
}

4、获取成员方法的四种方式

  • getMethods()getDeclaredMethod(String name, Class<?>... parameterTypes)获取public修饰的成员方法;
  • getDeclaredMethods()getDeclaredMethod(String name, Class<?>... parameterTypes) 获取当前类的所有成员方法;
// 获取实例方法
private static void getMethodsDemo() throws Exception{
    Class<Person> cls = Person.class;
    // 获取public方法,包括父类的方法
    Method[] methods = cls.getMethods();
    for (Method method : methods) {
        System.out.println(method);
    }
    System.out.println("------------");
    // 获取当前类的所有方法
    Method[] declaredMethods = cls.getDeclaredMethods();
    for (Method declaredMethod : declaredMethods) {
        System.out.println(declaredMethod);
    }
    // 获取eat方法
    Method eat = cls.getDeclaredMethod("eat");
    System.out.println(eat);    // void com.yusian.reflex.Person.eat()
}

5、构造方法与实例方法的调用

// 构造方法或实例方法的调用
private static void invokeDemo() throws Exception{
    // 获取Person类对象
    Class<Person> cls = Person.class;
    // 获取Person对象的带参数构造函数
    Constructor<Person> constructor = cls.getConstructor(String.class, int.class);
    // 利用构造函数的newInstance方法生成实例对象
    Person sian = constructor.newInstance("Sian", 21);
    System.out.println(sian);
    // 获取类对象方法,调用实例的方法
    Method eat = cls.getDeclaredMethod("eat");
    eat.invoke(sian);

    Method method = cls.getDeclaredMethod("methodD");
    // 如果是私有方法,则需要授权访问
    method.setAccessible(true);
    method.invoke(sian);
}

什么叫反射:将类的各个组成部分封装为其他对象,这就是反射!

Leave a Reply