最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單總結(jié)Java的反射機(jī)制的運(yùn)用

 更新時(shí)間:2015年11月23日 16:28:33   作者:turkeyzhou  
這篇文章主要介紹了Java的反射機(jī)制的運(yùn)用,對(duì)一些常用的類作了一些說明,需要的朋友可以參考下

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

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

20151123162628545.png (744×312)

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

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

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

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

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

以及下面的幾種方法:

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


分別是獲取這個(gè)類的相應(yīng)的Constructor,field,method的;

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


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

public static final String name="corey";

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

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

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


Constructor:

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


Field:

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

Method:

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

下面是一份實(shí)例代碼:

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 zhou
firstName accessible false
lastName accessible false
publicName accessible false
getFirstName
getLastName
setLastName
setFirstName
syna wang

相關(guān)文章

最新評(píng)論

赞皇县| 景泰县| 潍坊市| 泉州市| 汉中市| 芜湖县| 库尔勒市| 东乡| 太仓市| 肥东县| 社旗县| 沈阳市| 兰溪市| 新昌县| 常山县| 阿鲁科尔沁旗| 板桥市| 保亭| 遵义县| 兴文县| 南阳市| 辉县市| 望奎县| 大安市| 扶余县| 富川| 盈江县| 江津市| 鹤壁市| 吉林市| 关岭| 河池市| 太仆寺旗| 乌拉特后旗| 洪湖市| 鸡泽县| 南郑县| 辽阳市| 茌平县| 日喀则市| 孟州市|