原文地址:http://emmet1988.iteye.com/blog/1064621
1.获取对象
共三个,例子代码如下:
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对象的accessoble标志设置为指示的布尔值。
布尔值为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,Xxx val);将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, "ChenJianLi");
- // 类是
- Field ageField = personClass.getDeclaredField("age");
- ageField.setAccessible(true);
- ageField.setInt(person, 22);
- // 打印
- System.out.println(person);
- }
- }
1.获取对象
共三个,例子代码如下:
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对象的accessoble标志设置为指示的布尔值。
布尔值为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,Xxx val);将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, "ChenJianLi");
- // 类是
- Field ageField = personClass.getDeclaredField("age");
- ageField.setAccessible(true);
- ageField.setInt(person, 22);
- // 打印
- System.out.println(person);
- }
- }