Java的反射机制
反射是Java语言的特征之一。在运行状态下,对于任意一个类都可以获取其中的属性和方法,对于任意一个对象,都能够调用它的任意一个方法,访问它的任意属性;这种动态的获取类的信息,及调用对象方法的功能称为Java的反射机制。
Class类
Class类是反射中最重要的一个类,该类没有公开的构造方法。每一个类在类加载时,JVM都会为该类自动生成一个Class对象,每一个类都仅有一个Class对象。
不仅类具有Class对象,任何类型都有Class对象如接口,基本类型,枚举等等。
该对象存放着对应类型对象的运行时信息。
取得一个类的Class对象
取得一个类的Class对象主要有三种方式:
- 通过对象取得调用Object类的
getClass()
方法。 - 通过“类.class”获得
- 通过Class类提供的静态方法
Class.forName(类的全名称)
取得。
取得一个类的Class对象,就可以对这个类进行任何操作。
反射类的继承结构
反射的基本使用(大量API)
1.取得父类信息
- 取得父类的Class对象
public native Class<? super T> getSuperclass();
- 取得实现的父接口
:public Class<?>[] getInterfaces()
因为可能实现多个接口,因此返回类型是一个数组。
2.反射调用构造
- 取得本类中的构造方法(仅限public修饰)
public Constructor<?>[] getConstructors() throws SecurityException
- 取得本类中所有的构造方法(包括private修饰的)
public Constructor<?>[] getDeclaredConstructors() throws SecurityException
- 取得指定参数的构造方法(非private修饰的)
public Constructor getConstructor(Class<?>… parameterTypes)
throws NoSuchMethodException, SecurityException
- 实例化对象(本质调用类中的无参构造)
public T newInstance(Object … initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
- 实例化对象(Constructor类中的newInstance方法)
public T newInstance(Object … initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
3 反射调用普通方法
- 取得本类及父类的普通方法 (仅限public修饰的)
public Method[] getMethods() throws SecurityException
- 取得本类所有的普通方法(包括private修饰的)
public Method[] getDeclaredMethods() throws SecurityException
- 取得指定方法名称和参数的普通方法
public Method getMethod(String name, Class<?>… parameterTypes)
- 通过反射调用指定方法(参数 该类对象,方法参数)
public Object invoke(Object obj, Object… args)throws IllegalAccessException,
IllegalArgumentException,InvocationTargetException
4.反射访问类中属性
- 取得本类及父类的属性(仅限public修饰)
public Field[] getFields() throws SecurityException
- 取得本类中全部属性(包括private修饰的)
public Field[] getDeclaredFields() throws SecurityException
- 取得本类指定名称的属性(参数为属性名称)
public Field getDeclaredField(String name)
throws NoSuchFieldException, SecurityException
- 设置属性内容(不能修改final修饰的属性)
public void set(Object obj, Object value) throws IllegalArgumentException,
IllegalAccessException
- 取得属性内容
public Object get(Object obj) throws IllegalArgumentException,
IllegalAccessException