定义

Reflection
Java反射是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法,属性和父类等信息,还包括实例的创建和实例类型的判断等。


Class类

描述类的类
对于每个类而言,JRE都为其保留了一个不变的Class类型的对象,一个Class对象包含了特定某个结构的有关信息(属性,方法,构造器)

  • Class本身也是一个类
  • Class对象只能由系统建立对象(用户使用反射获取)
  • 一个加载的类在JVM中只会有一个Class实例
  • 每个类的实例都会记得自己是由哪个Class实例所生成
  • 通过Class可以完整得到一个类中所有被加载的结构
  • Class类是反射的根源,想要动态加载运行类,都需要先获得相应Class对象

Class实例的获得方式

1. 通过具体对象获得

Person person = new Student();
Class c1 = person.getClass();

2. 通过forname

Class c2 = Class.forName("com.xxx.Student");

3. 通过类名.class

Class c3 = Student.class;

4. 通过一个Class实例的获得其父类Class实例

Class c4 = c1.getSuperClass();

所有类型对应的Class

    public static void main(String[] args) {
        Class c1 = Object.class;  // 类
        Class c2 = Comparable.class;  // 接口
        Class c3 = String[].class;  // 一维数组
        Class c4 = int[][].class;   // 二维数组
        Class c5 = Override.class;  // 注解
        Class c6 = ElementType.class;  // 枚举
        Class c7 = int.class;     // 基本数据类型
        Class c8 = void.class;     // void
        Class c9 = Class.class;     // Class
        
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);
        System.out.println(c9);
        
    }

输出

class java.lang.Object
interface java.lang.Comparable
class [Ljava.lang.String;
class [[I
interface java.lang.Override
class java.lang.annotation.ElementType
int
void
class java.lang.Class

类的加载


获得Class实例结构信息

    public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Class.forName("com.syn.BuyTicket");

        Field[] fields = c1.getFields();  // 获取公共属性
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("===========");
        fields = c1.getDeclaredFields();  // 获取所有属性
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("=========");

        Method[] methods = c1.getMethods();  // 获取本类及父类的所有public方法
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("============");

        methods = c1.getDeclaredMethods();  // 获取本类所有方法
        for (Method method : methods) {
            System.out.println(method);
        }
    }

通过反射动态创建对象

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class c1 = Class.forName("com.reflection.User");

        // 构造一个对象
        User user = (User) c1.newInstance();  // 本质是调用无参构造器

        System.out.println(user);

        // 通过构造器
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);

        User user2 = (User) constructor.newInstance("fsr", 1212, 22);
        System.out.println(user2);
    }

反射操作注解

通过注解和反射可以完成ORM,即对象关系映射,也就是类和表结构的映射关系。

最后修改:2020 年 07 月 28 日
如果觉得我的文章对你有用,请随意赞赏