创建对象

创建对象即利用反射调用类的构造方法,主要与 Constructor 类有关。下面给出了一个示例:

  1. Class<Random> cl = Random.class;
  2. Constructor<Random> constructor = cl.getConstructor(long.class); // parameter type
  3. Random random = constructor.newInstance(10L);

调用方法

Method 类提供了 invoke() 方法实现方法的调用,示例代码如下所示:

  1. String str = "Hello world";
  2. Class<String> cl = String.class;
  3. Method startsWith = cl.getDeclaredMethod("startsWith", String.class, int.class); // method name, two method parameter types
  4. Object obj = startsWith.invoke(str, "w", 6); // Object invoke(Object obj, Object... args)

注意 invoke() 方法的返回值是 Object 类型,可以使用强制类型转换将返回值转换为正确的类型。如果调用的是静态方法,则 invoke() 方法会忽略第一个参数的传入值,因此可以设置为 null

获取和设置对象属性值

Field 类提供了 get()set() 方法用于获取或设置对象属性值,示例代码如下所示:

  1. String str = "Hello";
  2. Class<String> cl = String.class;
  3. Field value = cl.getDeclaredField("value"); // private final char value[];
  4. value.setAccessible(true); // value[] is private
  5. value.set(str, "World".toCharArray());
  6. char[] chars = (char[]) value.get(str); // public Object get(Object obj)
  7. String newStr = new String(chars);
  8. System.out.println(newStr); // output is World

通过示例代码,可以得出以下结论:

  • 如果想获取或修改对象的 private 属性,则必须先调用 field.setAccessible(true) 方法。
  • set() 方法可以修改 final 修饰的属性值;
  • get() 方法返回的是 Object 类型。

setAccessible()

ConstructorMethodField 类都有 setAccessible() 方法,如果想要利用反射机制调用 private 方法,或获取和设置 private 属性值,都必须先调用该方法,将资源的可访问性设置为允许。