Java反射

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实例的三种方式

  1. 实例对象.getClass()
  2. Class.forName(“类的全限定名”);
  3. 类型名.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)

你可能感兴趣的:(Java反射)