反射機制

反射:主要是指程序可以訪問、檢測和修改它本身狀態或行爲的
      一種能力,並能根據自身行爲的狀態和結果,調整或修改
      應用所描述行爲的狀態和相關的語義。
看這個概念很暈的
反射機制的作用:
  1.反編譯  .class ---> .java
  2.通過反射機制訪問java對象的屬性,方法,構造方法等
反射機制的好處:解耦合,降低耦合度,提高安全性,可維護性

三階段:
 1.Source 源碼階段  類加載器ClassLoader加載進內存,就成了對象
 2.Class類階段 String name Field[] fieldd 字段 Method[] methods             方法  Constructor[] cons構造器 newInstance()對象
 3.runtime階段  創建對象  調用方法

獲取Class對象的三種方法:
   1.反射 Class.forName("");
   2.類名.class

   3.obj.getClass();


Demo3:

/*

 *Class對象能幹什麼?

 * 獲取對象

 * 創建對象

 * 獲取字段

 * 獲取方法

 * 獲取構造器

 */

ReflectDemo3.java:

public class ReflectDemo3 {

        publicstatic void main(String[] args) throws Exception {      

                 //獲取對象

                 Classclazz = Class.forName("com.reflect.Demo3.Student");

                 Objectobj = clazz.newInstance();

//              System.out.println(obj+"asdfghj");

                

                 //獲取所有公共字段(getFields())

                 Field[]fields = clazz.getFields();  //只能得到類公共的字段

                 for(Field field : fields) {

//                      System.out.println(field.getName());

                 }

                

                 //獲取所有字段(getDeclaredFields())

                 Field[]fields2 = clazz.getDeclaredFields();

                 for(Field field : fields2) {

//                      System.out.println(field.getName());

                 }

                

                 //獲取某個字段1

                 Fieldsex = clazz.getField("sex");

                 sex.set(obj,1);

//              System.out.println(obj);

                

                 //獲取某個字段2

                 Fieldname = clazz.getDeclaredField("name");

                 name.setAccessible(true);  //暴力反射,取消訪問的權限檢查(查詢field)

                 name.set(obj,"xxx");

//              System.out.println(obj);

                

                 //獲取方法1

                 Method[]methods = clazz.getMethods(); //獲取公共的方法,包括父類的

                 for(Method method : methods) {

//                      System.out.println("method:"+method.getName());

                 }

                

                 //獲取方法2

                 Method[]declaredMethods = clazz.getDeclaredMethods(); //獲取本類定義的所有方法,沒有父類的

                 for(Method method : declaredMethods) {

                         System.out.println("method:"+method.getName()+"*****");

                 }

                

                 //獲取構造器

 

                 Constructor[]cons = clazz.getConstructors();

                 for(Constructor constructor : cons) {

                         System.out.println(constructor.getName());//以字符串形式返回此構造方法的名稱。

                         System.out.println(constructor.getModifiers());//獲取修飾符 返回值int類型

                         System.out.println(Modifier.toString(constructor.getModifiers()));//獲取修飾符

                 }

                

        }

}


Student.java:

public class Student {

        privateString name;

        privateint age;

        publicint sex;   //公有的

       

        publicString getName() {

                 returnname;

        }

        publicvoid setName(String name) {

                 this.name= name;

        }

        publicint getAge() {

                 returnage;

        }

        publicvoid setAge(int age) {

                 this.age= age;

        }

        publicint getSex() {

                 returnsex;

        }

        publicvoid setSex(int sex) {

                 this.sex= sex;

        }

        @Override

        publicString toString() {

                 return"Student [age=" + age + ", name=" + name + ",sex=" + sex + "]";

        }

       

        publicStudent(String name, int age, int sex) {

                 this.name= name;

                 this.age= age;

                 this.sex= sex;

        }

       

        publicStudent() { }

       

        publicStudent(String name) {

                 this.name= name;

        }

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章