创建对象
创建对象即利用反射调用类的构造方法,主要与 Constructor 类有关。下面给出了一个示例:
Class<Random> cl = Random.class;Constructor<Random> constructor = cl.getConstructor(long.class); // parameter typeRandom random = constructor.newInstance(10L);
调用方法
Method 类提供了 invoke() 方法实现方法的调用,示例代码如下所示:
String str = "Hello world";Class<String> cl = String.class;Method startsWith = cl.getDeclaredMethod("startsWith", String.class, int.class); // method name, two method parameter typesObject obj = startsWith.invoke(str, "w", 6); // Object invoke(Object obj, Object... args)
注意 invoke() 方法的返回值是 Object 类型,可以使用强制类型转换将返回值转换为正确的类型。如果调用的是静态方法,则 invoke() 方法会忽略第一个参数的传入值,因此可以设置为 null 。
获取和设置对象属性值
Field 类提供了 get() 和 set() 方法用于获取或设置对象属性值,示例代码如下所示:
String str = "Hello";Class<String> cl = String.class;Field value = cl.getDeclaredField("value"); // private final char value[];value.setAccessible(true); // value[] is privatevalue.set(str, "World".toCharArray());char[] chars = (char[]) value.get(str); // public Object get(Object obj)String newStr = new String(chars);System.out.println(newStr); // output is World
通过示例代码,可以得出以下结论:
- 如果想获取或修改对象的 private 属性,则必须先调用
field.setAccessible(true)方法。 set()方法可以修改 final 修饰的属性值;get()方法返回的是Object类型。
setAccessible()
Constructor 、 Method 、 Field 类都有 setAccessible() 方法,如果想要利用反射机制调用 private 方法,或获取和设置 private 属性值,都必须先调用该方法,将资源的可访问性设置为允许。
