Java学习 之 获取Class对象、使用反射生成并操作对象

原文地址: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。

 

示例代码如下:

 

Java代码  
  1. import java.lang.reflect.Field;  
  2.   
  3. class Person{  
  4.       
  5.     private String name;  
  6.     private int age;  
  7.       
  8.     public String toString(){  
  9.         return "Person[name:  "+name+",age:  "+age+"]";  
  10.     }  
  11.       
  12. }  
  13.   
  14. public class FieldTest {  
  15.   
  16.     public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {  
  17.         // 创建一个Person对象  
  18.         Person person = new Person();  
  19.         // 获取该Person类的Class实例  
  20.         Class personClass = Person.class;  
  21.         // 获取属性名为name的属性  
  22.         Field nameField = personClass.getDeclaredField("name");  
  23.         // 设置通过反射访问该Field时取消访问权限检查  
  24.         nameField.setAccessible(true);  
  25.         // 设置新的值  
  26.         nameField.set(person, "ChenJianLi");  
  27.           
  28.         // 类是  
  29.         Field ageField = personClass.getDeclaredField("age");  
  30.         ageField.setAccessible(true);  
  31.         ageField.setInt(person, 22);  
  32.           
  33.         // 打印  
  34.         System.out.println(person);  
  35.     }  
  36.       
  37. }  

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。

 

示例代码如下:

 

Java代码  
  1. import java.lang.reflect.Field;  
  2.   
  3. class Person{  
  4.       
  5.     private String name;  
  6.     private int age;  
  7.       
  8.     public String toString(){  
  9.         return "Person[name:  "+name+",age:  "+age+"]";  
  10.     }  
  11.       
  12. }  
  13.   
  14. public class FieldTest {  
  15.   
  16.     public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {  
  17.         // 创建一个Person对象  
  18.         Person person = new Person();  
  19.         // 获取该Person类的Class实例  
  20.         Class personClass = Person.class;  
  21.         // 获取属性名为name的属性  
  22.         Field nameField = personClass.getDeclaredField("name");  
  23.         // 设置通过反射访问该Field时取消访问权限检查  
  24.         nameField.setAccessible(true);  
  25.         // 设置新的值  
  26.         nameField.set(person, "ChenJianLi");  
  27.           
  28.         // 类是  
  29.         Field ageField = personClass.getDeclaredField("age");  
  30.         ageField.setAccessible(true);  
  31.         ageField.setInt(person, 22);  
  32.           
  33.         // 打印  
  34.         System.out.println(person);  
  35.     }  
  36.       
  37. }  

你可能感兴趣的:(Java基础)