Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。
public class JavaTest { public static void main(String[] args) { try { Class myClass = Class.forName("Student"); Object student = (Object)myClass.newInstance(); Method method = myClass.getMethod("printStudent",String.class,String.class); method.invoke(student, "2015", "ZhangSan"); } catch (Exception e) { e.printStackTrace(); } System.out.println("End"); } } class Student { public void printStudent(final String id,final String name) { System.out.println("id = " + id + ", name = " + name); } }
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
- 对带有指定参数的指定对象调用由此
Method
对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。如果底层方法是静态的,那么可以忽略指定的
obj
参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的
args
数组长度可以为 0 或 null。- 参数:
obj
- 从中调用底层方法的对象args
- 用于方法调用的参数- 返回:
- 使用参数
args
在obj
上指派该对象所表示方法的结果 - 抛出:
IllegalAccessException
- 如果此Method
对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。IllegalArgumentException
- 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。InvocationTargetException
- 如果底层方法抛出异常。NullPointerException
- 如果指定对象为 null,且该方法是一个实例方法。ExceptionInInitializerError
- 如果由此方法引起的初始化失败。