跳转至

5. 反射获取类结构

使用 Class 实现了对象实例化,并且通过 Class 类反射实例化对象,但是这并不意味着这些全部都属于反射机制的功能,如果认真分析的话,实际上反射可以完整的实现 Java 允许规定的类的操作模式。

如果在日后的开发中发现,需要对二进制文件进行更深入分析的时候:

  • 选择一:通过 Oracle 的官方标准进行二进制字节流数据的读取分析
  • 选择二:使用第三方工具包(Java Reflection)可以实现 (*.class) 文件的分析

获取类的结构信息

Class 作为所有反射操作的源头,于是在 Class 类里面就可以获取一些结构上的信息,例如:类所在的包、类所继承的父类、类所实现的相关方法。方法如下:

序号 方法名 类型 释义
1 public Package getPackage() 方法 程序所在的包名称
2 public Class<?> getSuperclass() 方法 获取所继承的父类
3 public Class<?>[] getInterfaces() 方法 获取所有的父接口

范例:获取父结构信息

import java.util.Arrays;

interface IMessage {}

class MessageImpl implements IMessage {}

public class Test {
    public static void main(String[] args) {
        Class<?> clazz = MessageImpl.class;

        // 获取包名
        Package pkg = clazz.getPackage();
        System.out.println("包名: " + pkg.getName());

        // 获取父类
        Class<?> superClass = clazz.getSuperclass();
        System.out.println("父类: " + superClass.getName());

        // 获取实现的接口
        Class<?>[] interfaces = clazz.getInterfaces();
        System.out.println("实现的接口: " + Arrays.toString(interfaces));
    }
}

范例:通过反射获取类的父类与接口

interface China {
    public static final String NATIONAL = "China";
    public static String Guojia = "China";
    public abstract void say();
}

class Person implements China {
    private String name;
    public int age;

    public Person() {}

    public Person(String name) {
        this.name = name;
    }

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

    @Override
    public void say() {
        System.out.println("Hello!");
    }
}

public class GetClassDemo {
    public static void main(String[] args) {
        Class<?> clazz = Person.class;

        // 获取包名
        Package p = clazz.getPackage();
        System.out.println("包名: " + p.getName());

        // 获取父类
        Class<?> superClass = clazz.getSuperclass();
        System.out.println("父类: " + superClass.getName());

        // 获取所有接口
        Class<?>[] interfaces = clazz.getInterfaces();
        System.out.println("实现的接口: " + Arrays.toString(interfaces));
    }
}

结果:

包名: com.example
父类: java.lang.Object
实现的接口: interface China