创建对象
创建对象即利用反射调用类的构造方法,主要与 Constructor
类有关。下面给出了一个示例:
Class<Random> cl = Random.class;
Constructor<Random> constructor = cl.getConstructor(long.class); // parameter type
Random 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 types
Object 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 private
value.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 属性值,都必须先调用该方法,将资源的可访问性设置为允许。