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