Java反射
Java反射与Apache POI的练习,实现Excel导出到对应的Javabean:reflect-poi
什么是反射
自我理解:
反射机制是指在运行状态下,通过动态加载.class文件,从而获得该类的组成元素,并可以调用该类的任意方法和访问该类任意属性的机制。
Class类与Class实例
每一个类是一种约定,用来描述该类的实例该如何创建;而Class类则用来约定,每一个类文件应该是怎样的结构,也就是说每一个Class类的实例都对应着一个.class
文件。
Class类的实例表示正在运行的 Java 应用程序中的类和接口。
每一个.class文件的结构都有明确的规定,参考https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
获得Class实例的三种方式
- 实例对象.getClass()
- Class.forName(“类的全限定名”);
- 类型名.class
内置的Class实例:
boolean.classs | Boolean.TYPE |
---|---|
char.class | Character.TYPE |
byte.class | Byte.TYPE |
short.class | Short.TYPE |
int.class | Integer.TYPE |
long.class | Long.TYPE |
float.class | Float.TYPE |
double.class | Double.TYPE |
void.class | Void.TYPE |
需要注意的是int.class!=Integer.class
。
操作构造器
class User {
public String name;
public int age;
public User() {
}
public User(String name) {
}
private User(String name, int age) {
}
}
获得构造器
获得Class类中的所有public类型的构造器:
public Constructor<?>[] getConstructors()
获得Class类中所有的构造器,它们是公共、保护、默认(包)访问和私有构造方法:
public Constructor<?>[] getDeclaredConstructors()
调用构造器创建实例对象:
Class<?> aClass = Class.forName("main.java.User");
// Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
// System.out.println(Arrays.toString(declaredConstructors));
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Object o = constructor.newInstance("will", 17);
System.out.println(o);
如果构造器为private
修饰的,则需要在调用newInstance
之前,设置为可见:.setAccessible(true);
如果是调用默认构造器创建对象,则可以直接调用Class.newInstance();
。
操作方法
获取所有的公共的方法,包括父类和接口中的public方法:
Class:
public Method[] getMethods() // 返回的数组中的元素没有特定的顺序
获取该Class对象表示的类或者接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,不包括继承的方法:
Class:
public Method[] getDeclaredMethods() // 返回的数组中的元素没有特定的顺序
方法的调用:
Method:
public Object invoke(Object obj, Object... args) // 个别参数被自动解包,以便与基本形参相匹配
注意:如果底层方法是静态的,那么可以忽略指定的 obj
参数。该参数可以为 null。
操作属性
获取所有的公共的字段,包括父类和接口中的public字段:
Class:
public Field[] getFields()
获取该Class对象表示的类或者接口声明的所有字段,包括公共、保护、默认(包)访问和私有字段,不包括继承的字段:
Class:
public Field[] getDeclaredFields()
获取和设置字段值:
获取字段值 | 设置字段值 |
---|---|
public Object get(Object obj) | public void set(Object obj, Object value) |
public boolean getBoolean(Object obj) | public void setBoolean(Object obj, boolean z) |
public char getChar(Object obj) | … |
public byte getByte(Object obj) | … |
public short getShort(Object obj) | … |
public int getInt(Object obj) | … |
public long getLong(Object obj) | … |
public float getFloat(Object obj) | … |
public double getDouble(Object obj) | … |