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

    xiaoxiao2021-03-26  29

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

     

    示例代码如下:

     

    Java代码   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);       }          }  
    转载请注明原文地址: https://ju.6miu.com/read-663641.html

    最新回复(0)