美文网首页
获取Class对象,使用反射生成并操作对象

获取Class对象,使用反射生成并操作对象

作者: 今有所思 | 来源:发表于2016-10-09 21:35 被阅读188次

    1. 获取对象

    有三种获取对象的方式,如下所示:

    1. Class.forName("类名字符串")(注意:类名字符串必须是全称,包名+类名);
    2. 类名.class
    3. 实例对象.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);  
      }  
        
    }  
    

    相关文章

      网友评论

          本文标题:获取Class对象,使用反射生成并操作对象

          本文链接:https://www.haomeiwen.com/subject/bvrmyttx.html