1. 获取对象
有三种获取对象的方式,如下所示:
- Class.forName("类名字符串")(注意:类名字符串必须是全称,包名+类名);
- 类名.class
- 实例对象.getClass()
例子代码如下:
String sring = null;
Class class1 = String.class; //该方法最为安全可靠,程序性能更高。
Class class2 = string.getClass();
Class class3 = Class.forName("java.lang.String");// 可能抛出ClassNotFoundException异常
一旦获取了该类所对应的Class对象之后,就可以通过调用Class对象的方法来获得该对象和该类的真实信息了。
2.创建对象
通过反射来生成对象有如下两种方式:
(1)使用Class对象的newInstance()方法来创建该Class对象对应类的实例。但是这种方式要求该Class对象的对应类有默认的构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
(2)先使用Class对象获取指定的Constructor对象,再调用Construtor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。
另外,如果我们不想利用默认构造器来创建Java对象,而想利用指定的构造器来创建Java对象,则需要利用Construtor对象,每个Construtor对应一个构造器,为了利用指定构造器来创建Java对象,需要如下三个步骤:
(1)获取该Class对象;
(2)利用该Class对象的getConstrutor方法来获取指定的构造器;
(3)调用Construtor的newInstance方法来创建Java对象。
3.调用方法
获取到某个类的Class对象之后,可以通过该Class对象的getMethods方法或者getMethod方法获取全部或指定方法。
每个Method对象对应一个方法,获得Method对象后,程序就可通过该Method来调用对应的方法,在Method里包含一个invoke方法,该方法签名如下:
Object invoke(Object obj,Object...args);
该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参。
当通过Method的invoke方法来调用对应的方法时,Java会要求程序必须要有调用该方法的权限。如果程序确实需要调用该对象的私有方法,则可先调用Method对象的:
setAccessible(boolean flag);
方法,将Method对象的accessible标志设置为指示的布尔值。
- 布尔值为true,则表示该Method在使用时应该取消Java语言访问权限检查;
- 布尔值为false,则表示该Method在使用时应该实施Java语言访问权限检查。
4.访问属性值
通过Class对象的getFields或getField方法可以获取该类所包括的全部Field(属性)或指定Field(包括私有属性)**,Field提供了如下两组方法来访问属性:
getXxx(Object obj); 获取obj对象该Field的属性值,此处的Xxx对应8个基本类型,如果该属性的类型是引用类型则取消get后面的Xxx。
setXxx(Object obj,Xxxval); 将obj对象的该Field设置成val值,此处的Xxx对应8个基本类型,如果该属性的类型是引用类型则取消set后面的Xxx。
示例代码如下:
import java.lang.reflect.Field;
class Person{
private String name;
private int age;
public String toString(){
return "Person[name:" + name + " age:" + age + "]";
}
}
public class FieldTest {
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
// 创建一个Person对象
Person person = new Person();
// 获取该Person类的Class实例
Class<Person> personClass = Person.class;
// 获取属性名为name的属性
Field nameField = personClass.getDeclaredField("name");
// 设置通过反射访问该Field时取消访问权限检查
nameField.setAccessible(true);
// 设置新的值
nameField.set(person, "GuangleiPan");
// 类似
Field ageField = personClass.getDeclaredField("age");
ageField.setAccessible(true);
ageField.setInt(person, 22);
// 打印
System.out.println(person);
}
}
网友评论