2三、Java的反射

反射:框架設計的靈魂web

 

框架:半成品軟件。能夠在框架的基礎上進行軟件開發,簡化代碼框架

反射:將類的各個組成部分封裝爲其餘對象,這就是反射機制(在Class類中包裝)設計

        好處:一、能夠在程序運行過程當中,操做這些對象對象

                 二、能夠解耦,提升程序的可擴展性內存

 

獲取Class對象的方式:開發

一、Class.forName("全類名"):將字節碼文件加載進內存,返回class對象,全類名就是包名加上類名get

     多用於配置文件,將類名定義在配置文件中,讀取文件,加載類servlet

二、類名.class:經過類名的屬性class獲取io

    多用於參數的傳遞class

三、對象.getClass():getClass()方法在Object類中定義

    多用於對象的獲取字節碼的方式

注意:同一個字節碼文件(*.class)在一次程序運行過程當中,只會被加載一次,不論經過哪種方式獲取的class對象都是同一個。

示例代碼:

public class Demo {

    public static void main(String[] args) throws Exception{
      Class cls1 = Class.forName("lianbang.wu.web.servlet.Person");
      System.out.println(cls1);
      Class cls2 = Person.class;
      System.out.println(cls2);
      Person p1 = new Person();
      Class cls3 = p1.getClass();
      System.out.println(cls3);
    }

}

使用Class對象功能:

獲取功能:一、獲取成員變量

               二、獲取構造方法                     

               三、獲取成員方法

               四、獲取類名

示例代碼:

public class Demo {

    public static void main(String[] args) throws Exception{
      Class personClass=Person.class;
        Field[] fields = personClass.getFields();
        Field field = personClass.getField("level");
        Person p =new Person("讀者",18,2);
        Object value = field.get(p);
        System.out.println(value);
        field.set(p,3);
        System.out.println(p.level);

        Field field1 =personClass.getDeclaredField("age");
        field1.setAccessible(true);
        Object value1 =field1.get(p);
        System.out.println(value1);
        System.out.println(p.getAge());

        Constructor constructor =personClass.getConstructor(String.class,int.class,int.class);
        Object p1 =constructor.newInstance("新讀者",19,3);
        Object p2 =personClass.newInstance();

        Method method = personClass.getMethod("eat", String.class);
        method.invoke(p,"飯");
        System.out.println(method.getName());

        System.out.println(personClass.getName());
    }

}
相關文章
相關標籤/搜索