<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    和風(fēng)細(xì)雨

    世上本無(wú)難事,心以為難,斯乃真難。茍不存一難之見(jiàn)于心,則運(yùn)用之術(shù)自出。

    反射Reflection綜述

    反射Reflection是Java被視為動(dòng)態(tài)語(yǔ)言的一個(gè)關(guān)鍵性質(zhì).這個(gè)機(jī)制允許程序在運(yùn)行時(shí)通過(guò)Reflection APIs得到任何一個(gè)已知名稱(chēng)的類(lèi)的相關(guān)信息,包括其構(gòu)造方法,父類(lèi),實(shí)現(xiàn)的接口,成員變量(field)和成員方法(method)的相關(guān)信息,并可在運(yùn)行時(shí)改變成員變量的值或調(diào)用其方法.反射的高度靈活的特性使得它成為Java語(yǔ)言中最具魔力和活力的部分,它是許多流行框架的實(shí)現(xiàn)基礎(chǔ),如Struts,Spring和Hibernate,本篇將列舉一些反射常見(jiàn)的API:

    實(shí)現(xiàn)反射機(jī)制的類(lèi)
    在JDK中,主要由以下類(lèi)來(lái)實(shí)現(xiàn)Java反射機(jī)制,這些類(lèi)都位于java.lang.reflect包中:
    Class類(lèi):代表一個(gè)類(lèi)。
    Field 類(lèi):代表類(lèi)的成員變量(成員變量也稱(chēng)為類(lèi)的屬性)。
    Method類(lèi):代表類(lèi)的方法。
    Constructor 類(lèi):代表類(lèi)的構(gòu)造方法。
    Array類(lèi):提供了動(dòng)態(tài)創(chuàng)建數(shù)組,以及訪問(wèn)數(shù)組的元素的靜態(tài)方法。

    反射的源頭:Class類(lèi)
    Java類(lèi)繼承體系的是一個(gè)單根體系,所有類(lèi)的都起源于Object類(lèi),其內(nèi)聲明了數(shù)個(gè)應(yīng)該在所有Java class中被改寫(xiě)的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中g(shù)etClass()返回一個(gè)Class object。當(dāng)一個(gè)class被加載,或當(dāng)加載器(class loader)的defineClass()被JVM調(diào)用,JVM 便自動(dòng)產(chǎn)生一個(gè)Class object。
    由于在java.lang.Object 類(lèi)中定義了getClass()方法,因此對(duì)于任意一個(gè)Java對(duì)象,都可以通過(guò)此方法獲得對(duì)象的類(lèi)型。
    Class類(lèi)對(duì)象代表了Java應(yīng)用程序中的各種類(lèi)和接口.這些類(lèi)不是程序代碼生成的,而是在Java虛擬機(jī)(JVM)裝入各種類(lèi)時(shí)生成的.

    Static class forName(String className)
    這個(gè)方法返回以className為名字的Class對(duì)象。
    Object newInstance()
    創(chuàng)建該Class對(duì)象代表的類(lèi)的一個(gè)實(shí)例,類(lèi)似調(diào)用一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)。這個(gè)方法要求類(lèi)必須具有一個(gè)無(wú)參構(gòu)造函數(shù),如果沒(méi)有時(shí)調(diào)用此方法程序會(huì)拋出一個(gè)java.lang.InstantiationException異常,這也是許多框架要求類(lèi)具有一個(gè)無(wú)參構(gòu)造函數(shù)的根本原因
    package com.sitinspring;

    public class Member{
      
    private String name;
      
    private int age;
      
    private float salary;
      
      
    public Member(){
        name
    ="Unknown";
        age
    =20;
        salary
    =1.00f;
      }
      
      
    public String toString(){
        
    return "名稱(chēng)="+name+" 年齡="+age+" 薪水="+salary;
      }
      
      
    public static void main(String[] args){
        
    try{
          Class cls
    =Class.forName("com.sitinspring.Member");
          Member member
    =(Member)cls.newInstance();
          System.out.println(member);
        }
        
    catch(Exception ex){
          ex.printStackTrace();
        }
      }
    }

    Class getSuperclass()
    返回該Class對(duì)象代表的類(lèi)的父類(lèi)。如果該Class是Object,接口,基本數(shù)據(jù)類(lèi)型或void,則返回nulll,如果這個(gè)類(lèi)對(duì)象是數(shù)組,則返回Object類(lèi)的類(lèi)對(duì)象
    public class Member extends Thread implements Comparable{
      
    private String name;
      
    private int age;
      
    private float salary;
      
      
    public Member(){
        name
    ="Unknown";
        age
    =20;
        salary
    =1.00f;
      }
      
      
    public String toString(){
        
    return "名稱(chēng)="+name+" 年齡="+age+" 薪水="+salary;
      }
      
      
    public int compareTo(Object obj){
        Member another
    =(Member)obj;
        
        
    return this.age-another.age;
      }
      
      
    public static void main(String[] args){
        System.out.println(Member.
    class.getSuperclass());
        System.out.println(Object.
    class.getSuperclass());
        System.out.println(Comparable.
    class.getSuperclass());
        System.out.println(
    int.class.getSuperclass());
        System.out.println(
    void.class.getSuperclass());
        System.out.println(String[].
    class.getSuperclass());
      }
    }
    Class[] getInterfaces()
    返回該Class對(duì)象實(shí)現(xiàn)的接口。
    public class Member implements Comparable,Runnable{
      
    private String name;
      
    private int age;
      
    private float salary;
      
      
    public Member(){
        name
    ="Unknown";
        age
    =20;
        salary
    =1.00f;
      }
      
      
    public String toString(){
        
    return "名稱(chēng)="+name+" 年齡="+age+" 薪水="+salary;
      }
      
      
    public int compareTo(Object obj){
        Member another
    =(Member)obj;
        
        
    return this.age-another.age;
      }
      
      
    public void run(){
        
      }
      
      
    public static void main(String[] args){
        
    for(Class cls:Member.class.getInterfaces()){
          System.out.println(cls.toString());
        }
      }
    }
    輸出:
    interface java.lang.Comparable
    interface java.lang.Runnable

    Construtor[] getConstructors()
    Construtor[] getDeclaredConstructors()
    Construtor[] getConstructors(Class[] parameterTypes)
    Construtor[] getDeclaredConstructors(Class[] parameterTypes)

    返回構(gòu)造函數(shù),如果有parameterTypes,返回參數(shù)類(lèi)型為parameterTypes的構(gòu)造函數(shù),Declared是指類(lèi)中聲明的所有構(gòu)造函數(shù),如果沒(méi)有Declared,則只返回共有構(gòu)造函數(shù)。
    public class Member {
      
    private String name;

      
    private int age;

      
    private float salary;

      
    public Member() {
        name 
    = "Unknown";
        age 
    = 20;
        salary 
    = 1.00f;
      }

      
    public Member(String name, int age, float salary) {
        
    this.name = name;
        
    this.age = age;
        
    this.salary = salary;
      }

      
    public String toString() {
        
    return "名稱(chēng)=" + name + " 年齡=" + age + " 薪水=" + salary;
      }

      
    public static void main(String[] args) {
        
    for (Constructor cls : Member.class.getConstructors()) {
          System.out.println(cls.toString());
        }

        
    try {
          Class cls 
    = Class.forName("com.sitinspring.Member");
          Constructor con 
    =cls.getConstructor(new Class[]{String.classint.class,float.class});
          Member member 
    = (Member) con.newInstance(new Object[] {
              
    new String("Sitinspring"), new Integer(30),
              
    new Float(20000) });
          System.out.println(member); 
        } 
    catch (Exception e) {
          e.printStackTrace();
        }
      }
    }

    Field[] getFields()
    Field[] getDeclaredFields()
    Field getField(String name)
    Field[] getDeclaredFields(String name)

    返回成員變量。如果有name參數(shù),返回名字是name的成員變量,Declared指聲明中所有的成員變量,如果沒(méi)有Declared,則只返回公有成員變量。
    public class Member {
      
    private String name;

      
    private int age;

      
    private float salary;
      
      
    public String field1;
      
    protected String field2;

      
    public static void main(String[] args) {
        
    for (Field field : Member.class.getFields()) {
          System.out.println(field);
        }
        
        
    for (Field field : Member.class.getDeclaredFields()) {
          System.out.println(field.getName());
        }
      }
    }

    輸出:
    public java.lang.String com.sitinspring.Member.field1
    name
    age
    salary
    field1
    field2

    Method[] getMethods()
    Method[] getDeclaredMethods()
    Method getMethod(String name,Class[] parameterTypes)
    Method[] getDeclaredMethods(String name ,Class[] parameterTypes)

    返回類(lèi)的方法,如果有name和parameterTypes參數(shù),返回名字是name,且有parameterTypes參數(shù)列表的方法、Declared指聲明中所有的方法(包括public,private,protected),如果沒(méi)有Declared,則只返回公有方法。

    Method類(lèi)有一個(gè)重要方法
    Object invoke(Object obj,Object[] arg),
    通過(guò)它可以進(jìn)行類(lèi)方法調(diào)用,在后面的例子中會(huì)見(jiàn)到。
    public class Member {
      
    private String name;

      
    private int age;

      
    private float salary;

      
    public Member() {
        name 
    = "Unknown";
        age 
    = 20;
        salary 
    = 1.00f;
      }

      
    public String toString() {
        
    return "名稱(chēng)=" + name + " 年齡=" + age + " 薪水=" + salary;
      }
      
      
    public int getAge() {
        
    return age;
      }

      
    protected String getName() {
        
    return name;
      }

      
    private float getSalary() {
        
    return salary;
      }
      
      
    public static void main(String[] args) {
        
    for (Method method : Member.class.getMethods()) {
          System.out.println(method);
        }
        System.out.println(
    "--------------");
        
    for (Method method : Member.class.getDeclaredMethods()) {
          System.out.println(method);
        }
      }
    }

    調(diào)用類(lèi)的方法
    Method類(lèi)有一個(gè)重要方法
    Object invoke(Object obj,Object[] arg),
    Object代表返回值,obj是類(lèi)實(shí)例, arg是參數(shù)數(shù)組。

    這個(gè)方法能調(diào)用實(shí)例的一個(gè)方法。如右:
    public class Caculator{
      
    public int add(int op1,int op2){
        
    return op1+op2;
      }
      
      
    public int substract(int op1,int op2){
        
    return op1-op2;
      }
      
      
    public static void main(String[] args){
        
    try{
          Caculator caculator
    =new Caculator();
          
          Method addMethod 
    = caculator.getClass().getMethod(
              
    "add",
              
    new Class[] { int.class,int.class });

          Object result1
    =addMethod.invoke(caculator, new Object[] { 1,2 });
          System.out.println(
    "和="+result1);
          
          Method substractMethod 
    = caculator.getClass().getMethod(
              
    "substract",
              
    new Class[] { int.class,int.class });
          
          Object result2
    =substractMethod.invoke(caculator, new Object[] { 3,4 });
          System.out.println(
    "差="+result2);
        }
        
    catch(Exception ex){
          ex.printStackTrace();
        }
      }
    }

    通過(guò)Field對(duì)對(duì)象進(jìn)行設(shè)值取值請(qǐng)見(jiàn):http://m.tkk7.com/sitinspring/archive/2008/01/03/172455.html

    通過(guò)Method對(duì)對(duì)象進(jìn)行設(shè)值取值請(qǐng)見(jiàn):
    http://m.tkk7.com/sitinspring/archive/2008/01/05/172970.html

    posted on 2008-02-22 09:19 和風(fēng)細(xì)雨 閱讀(214) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲三级在线播放| 亚洲黄色网址在线观看| 国产免费AV片在线观看播放| 亚洲一级毛片中文字幕| 国产亚洲人成网站在线观看不卡| 日韩免费高清大片在线| 色婷五月综激情亚洲综合| 亚洲成av人片在线观看无码不卡| 又大又硬又爽又粗又快的视频免费| 有码人妻在线免费看片| 亚洲成a∨人片在无码2023| 亚洲免费观看在线视频| 亚洲第一成年男人的天堂| 国产亚洲精品精品国产亚洲综合| 日本免费观看网站| APP在线免费观看视频| 亚洲1234区乱码| 亚洲福利视频一区二区三区| 四虎免费永久在线播放| 毛片免费vip会员在线看| 222www免费视频| 亚欧在线精品免费观看一区| 久久亚洲免费视频| 国产日韩AV免费无码一区二区| 一级毛片免费毛片毛片| 羞羞网站在线免费观看| 亚洲第一香蕉视频| 911精品国产亚洲日本美国韩国| 久久亚洲国产成人亚| 精品国产亚洲一区二区三区| 亚洲情XO亚洲色XO无码| 久久91亚洲人成电影网站| 亚洲一区二区三区香蕉| 亚洲精品无码成人AAA片| 亚洲免费人成在线视频观看| 亚洲精品美女久久777777| 亚洲精品无码国产| 久久亚洲精品成人av无码网站| gogo全球高清大胆亚洲| 亚洲不卡无码av中文字幕| 亚洲精品国产福利一二区|