Java获取类的运行时结构

通过反射可以获取运行时类的完整结构:

  • Field 字段
  • Method 方法
  • Constructor 构造器
  • Superclass 父类
  • Interface 接口
  • Annotation 注解

示例:

package annoAndRe.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test06 {
    
    
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
    
    
        Class c1 = Class.forName("annoAndRe.reflection.user");

        // 获得类的名字(包名+类名)
        System.out.println(c1.getName());
        // 获得类的简单名字(类名)
        System.out.println(c1.getSimpleName());
        System.out.println();

        // 获得类的属性
        Field[] fields = c1.getFields();// 只能找到public属性
        fields = c1.getDeclaredFields();
        for (Field field : fields) {
    
    
            System.out.println(field);
        }
        System.out.println();

        // 获得指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println(name);
        System.out.println();

        // 获得类的方法
        Method[] methods = c1.getMethods();// 获得本类以及父类的public方法
        Method[] declaredMethods = c1.getDeclaredMethods();// 获得本类以及父类的所有方法

        for (Method method : methods) {
    
    
            System.out.println("正常的: " + method);
        }
        System.out.println();

        for (Method declaredMethod : declaredMethods) {
    
    
            System.out.println("declaredMethod: " + declaredMethod);
        }
        System.out.println();

        // 获得指定的方法
        Method getName = c1.getMethod("getName", null);
        Method setName = c1.getMethod("setName", String.class);
        System.out.println(getName);
        System.out.println(setName);
        System.out.println();

        // 获得类的构造器
        Constructor[] constructors = c1.getConstructors();
        for (Constructor constructor : constructors) {
    
    
            System.out.println(constructor);
        }
        System.out.println();

        Constructor[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
    
    
            System.out.println(declaredConstructor);
        }
        System.out.println();

        // 获得指定的构造器
        System.out.println(c1.getDeclaredConstructor(String.class, int.class));
    }
}

class user {
    
    
    String name;
    int age;

    public user() {
    
    
    }

    public user(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "user{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果:
在这里插入图片描述

在这里插入图片描述
总结:

  • 在实际的操作中,取得类的信息的操作代码,并不会经常开发。
  • 一定要熟悉java.lang.reflect包的作用,反射机制。如何取得属性、方法、构造器的名称,修饰符等。

猜你喜欢

转载自blog.csdn.net/I_r_o_n_M_a_n/article/details/114127355