国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

簡單總結(jié)Java的反射機制的運用

2019-11-26 14:49:26
字體:
供稿:網(wǎng)友

Java 的反射機制是使其具有動態(tài)特性的非常關鍵的一種機制,也是在JavaBean 中廣泛應用的一種特性。

簡單來說,一個類或者一個對象是擁有下面幾種屬性的:
Method,Constructor,Field,其大致結(jié)構(gòu)類圖如下:

20151123162628545.png (744×312)

我們現(xiàn)在用代碼來說明問題:

首先,我們看Class類,在Class類中,我們可以看見下面的幾個重要的方法;

  • getInterfaces()
  • getSuperClass();
  • isInterface();

這是用來得到一個類的接口或者超類,以及判斷這個類是不是一個接口;

  • forName(String className);根據(jù)一個類名得到一個相應的類類型;
  • getClassLoader();得到這個類相應的類加載器;

以及下面的幾種方法:

getField(Method/Constructor)(s)(name); getDeclaredField(Method/Constructor)(s)();


分別是獲取這個類的相應的Constructor,field,method的;

區(qū)別在于,含有Declared的方法能夠得到這個類所聲明的所有的屬性,而沒有Declared的只能得到公共public的屬性;


而繼承了Member分別賦予了這個三個類能夠得到聲明其的Class,用getDeclaringClass();在這里我們再次介紹一下Modifiers,我們都知道在field或者Constructor,Method前面都含有若干修飾符,如:

public static final String name="corey";

等等,我們應用getModifiers()能夠拿到這個修飾符的一個整形值,然后應用Modifier這個類的靜態(tài)方法來進行判斷;如:
   Modifier.isStatic(int)等等;

接下來,我們來看看AccessibleObject的幾個主要的方法,AccessibleObject中主要的幾個方式第一是
getAnnotation();得到某個屬性的注釋;
isAccessible();能否訪問;如果不能訪問,我們可以采取setAccessible(boolean)來設置其的可訪問性;(這個我們在spring中看到過);

然后我們分別來看看這個三個類一些重要的特性:


Constructor:

  • newInstance(args):能夠使用這個構(gòu)造器得到一個類的實例;


Field:

  • getType();得到這個字段的類;
  • set/get(Object,value):一系列的基本類型字段的設置方法或者Object的設置方法;

Method:

  • getParameterTypes();得到所有參數(shù)的類型;
  • getExceptionTypes();得到所有拋出異常的類型;
  • invoke(Object,args);調(diào)用Object對象的這個方法,參數(shù)是args;

下面是一份實例代碼:

package org.corey.demo;public interface IName {  public String getFirstName();  public void setFirstName(String firstName);  public String getLastName();  public void setLastName(String lastName);}package org.corey.demo;public class Name {  private String firstName;  private String lastName;  public String publicName;    public Name(String firstName, String lastName) {    this.firstName = firstName;    this.lastName = lastName;  }  public Name() {  }  public String getFirstName() {    return firstName;  }  public void setFirstName(String firstName) {    this.firstName = firstName;  }  public String getLastName() {    return lastName;  }  public void setLastName(String lastName) {    this.lastName = lastName;  }}package org.corey.demo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Demo {  /**   * @param args   */  public static void main(String[] args) {    try {      Class clazz = Class.forName("org.corey.demo.Name");      Constructor con = clazz.getDeclaredConstructor(new Class[] {          String.class, String.class });      Name corey = (Name)(con.newInstance("corey", "zhou"));      System.out.println(corey.getFirstName()+" "+corey.getLastName());      Field[] fields=clazz.getDeclaredFields();      for(int index=0;index<fields.length;index++){        System.out.println(fields[index].getName()+" accessible "+fields[index].isAccessible());              }      Method[] methods=clazz.getDeclaredMethods();      for(int index=0;index<methods.length;index++){        System.out.println(methods[index].getName());      }            Field field=clazz.getDeclaredField("firstName");      if(!field.isAccessible()){        field.setAccessible(true);        field.set(corey, "syna");      }            Method method=clazz.getDeclaredMethod("setLastName", new Class[]{String.class});            method.invoke(corey, "wang");            System.out.println(corey.getFirstName()+" "+corey.getLastName());    } catch (Exception e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }}

console:

corey zhoufirstName accessible falselastName accessible falsepublicName accessible falsegetFirstNamegetLastNamesetLastNamesetFirstNamesyna wang

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大兴区| 德格县| 宣城市| 嘉兴市| 梅河口市| 南开区| 湘乡市| 平度市| 丽水市| 保定市| 洱源县| 太湖县| 花莲市| 阳谷县| 安平县| 射阳县| 黔江区| 阳原县| 汾西县| 山丹县| 石门县| 南靖县| 石楼县| 莱西市| 永胜县| 青冈县| 南充市| 兴和县| 辽阳市| 南漳县| 萨迦县| 沙湾县| 城市| 库车县| 睢宁县| 西贡区| 阜宁县| 仪陇县| 湘潭市| 临颍县| 西和县|