java反射
反射:对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性
常用api
获取类对象
1.通过对象获取
Object obj = new Object();
obj.getClass();
2.通过类名获取
Object.class;
3.通过类的路径名获取
Class.forName(“com.metadata.Student”);
类的实例化和构造函数
获取类的实例化,可以使用clazz.newInstance(),但是这个类需要是无参构造函数,否则会抛出异常
1.获取公有构造函数,不包括父类
//Class
public Constructor<?>[] getConstructors()
public Constructor getConstructor(Class<?>… parameterTypes)
2.获取当前类构造函数,忽略修饰符
//Class
public Constructor<?>[] getDeclaredConstructors()
public Constructor getDeclaredConstructor(Class<?>… parameterTypes)
构造函数调用
//Constructor
public T newInstance(Object… initargs)
//忽略修饰符,强制调用
public void setAccessible(boolean flag
类成员变量的获取
1.获取公有变量,包括父类
//Class
public Field[] getFields()
public Field getField(String name)
2.获取当前类成员变量,忽略修饰符
//Class
public Field[] getDeclaredFields()
public Field getDeclaredField(String name)
成员变量赋值
//Field
//obj为实例对象
public void set(Object obj,Object value)
//忽略修饰符,强制调用
public void setAccessible(boolean flag)
类方法的获取
1.获取公有方法,包括父类
//Class
public Method[] getMethods()
public Method getMethod(String name,
Class<?>… parameterTypes)
2.获取当前类方法,忽略修饰符
//Class
public Method[] getDeclaredMethods()
public Method getDeclaredMethod(String name,
Class<?>… parameterTypes)
方法调用
//Method
//obj为类实例化对象,如果为静态方法obj为Null
invoke(Object obj, Object… args)
//忽略修饰符,强制调用
public void setAccessible(boolean flag)