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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Java從零開(kāi)始學(xué)四十(反射簡(jiǎn)述一)

2019-11-14 23:08:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
java從零開(kāi)始學(xué)四十(反射簡(jiǎn)述一)一、JAVA是動(dòng)態(tài)語(yǔ)言嗎?

一般而言,說(shuō)到動(dòng)態(tài)言,都是指在程序運(yùn)行時(shí)允許改變程序結(jié)構(gòu)或者變量類(lèi)型,從這個(gè)觀點(diǎn)看,JAVA和C++一樣,都不是動(dòng)態(tài)語(yǔ)言。

但JAVA它卻有著一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制:反射。通過(guò)反射,Java可以于運(yùn)行時(shí)加載、探知和使用編譯期間完全求和的類(lèi)、生成其對(duì)象實(shí)體,調(diào)用其方法或者對(duì)屬性設(shè)值。所以Java算是一個(gè)半動(dòng)態(tài)的語(yǔ)言吧。

反射的概念:

在Java中的反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;

對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;

這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱(chēng)為Java語(yǔ)言的反射機(jī)制

二、動(dòng)態(tài)性質(zhì)2.1、動(dòng)態(tài)性質(zhì)
  • 運(yùn)行時(shí)生成對(duì)象實(shí)例;
  • 運(yùn)行期間調(diào)用方法;
  • 運(yùn)行時(shí)更改屬性
2.2、Java反射機(jī)制能實(shí)現(xiàn)的功能
  • 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
  • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
  • 在運(yùn)行時(shí)判斷任意懷個(gè)類(lèi)所具有的方法和屬性
  • 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
  • 生成動(dòng)態(tài)代理
2.3、Java反射應(yīng)用場(chǎng)合

在Java程序中許多對(duì)象在運(yùn)行時(shí)都會(huì)出現(xiàn)兩種類(lèi)型:編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型

編譯時(shí)的類(lèi)型由聲明該對(duì)象時(shí)使用的類(lèi)型決定,運(yùn)行時(shí)的類(lèi)型由實(shí)際賦給對(duì)象的類(lèi)型決定

如:

Person p =new Student();

編譯時(shí)類(lèi)型為Person,而運(yùn)行時(shí)為Student

除此之外,程序在運(yùn)行時(shí)還可能接收到外部傳入的一個(gè)對(duì)象,該對(duì)象的編譯時(shí)類(lèi)型為Object,但程序又需要調(diào)用該對(duì)象運(yùn)行時(shí)類(lèi)型的方法。為了這些問(wèn)題程序需要在運(yùn)行時(shí)發(fā)現(xiàn)對(duì)象和類(lèi)的真實(shí)信息。然而,如果編譯時(shí)根本無(wú)法預(yù)知該對(duì)象和類(lèi)可能屬于哪些類(lèi),程序只依靠運(yùn)行時(shí)信息來(lái)發(fā)現(xiàn)該對(duì)象和類(lèi)的真實(shí)信息,此時(shí)就必須使用反射

三、Java反射API

反射API用來(lái)生成在當(dāng)前JAVA虛擬機(jī)中的類(lèi)、接口或者對(duì)象的信息。

  • Class類(lèi):反射的核心類(lèi),可以獲取類(lèi)的屬性,方法等內(nèi)容信息。
  • Field類(lèi):Java.lang.reflect.表示類(lèi)的屬性,可以獲取和設(shè)置類(lèi)的中屬性值。
  • Method類(lèi):Java.lang.reflect。表示類(lèi)的方法,它可以用來(lái)獲取類(lèi)中方法的信息或者執(zhí)行方法
  • Construcor類(lèi):Java.lang.reflect。表示類(lèi)的構(gòu)造方法。
四、獲取全部方法和屬性

Person類(lèi)

package com.pb.Reflect.classinfo;public class Person {    PRivate String name;    private String gender;    private int age;        private Person() {    //    }    public Person(String name, String gender, int age) {        super();        this.name = name;        this.gender = gender;        this.age = age;    }    //getter、和setter方法    private String getName() {        return name;    }    private void setName(String name) {        this.name = name;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }        public String toString(){        return "姓名:"+name+"年齡: "+age;    }    }

使用反射:

package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import javax.swing.JOptionPane;/* * 通過(guò)用戶(hù)輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性 * Declared獲取全部不管是私有和公有 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息 */public class ReflectDemo {    /*     * 構(gòu)造方法     */    public ReflectDemo(){        //用戶(hù)輸入類(lèi)的全路徑徑        //使用String組件        String classpsth=JOptionPane.showInputDialog(null,"輸入類(lèi)的全路徑");        //使用Class.forName方法根據(jù)輸入的類(lèi)的全路徑 返回該類(lèi)的Class對(duì)象        try {            Class cla = Class.forName(classpsth);            //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合            Method [] method=cla.getDeclaredMethods(); //返回所有的方法            System.out.println("========獲取方法信息============");            for (Method meth : method) {                //遍歷method數(shù)組,并輸出方法信息                System.out.println(meth.toString());            }            System.out.println("========獲取出方法信息結(jié)束============");            //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合             Field [] field=cla.getDeclaredFields();                System.out.println("========獲取成員屬性信息============");                for (Field f : field) {                    System.out.println(f.toString());                }                System.out.println("========獲取成員屬性信息結(jié)束============");            //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合                Constructor [] constructor=cla.getDeclaredConstructors();                System.out.println("========獲取成員構(gòu)造方法信息============");                for (Constructor constru : constructor) {                    System.out.println(constru.toString());                }                System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============");        } catch (ClassNotFoundException e) {            e.printStackTrace();            System.out.println("路徑輸入錯(cuò)誤!");        }    }    }

測(cè)試類(lèi):

package com.pb.Reflect.classinfo;public class TestReflection {    public static void main(String[] args) {        ReflectDemo rd=new ReflectDemo();    }}

輸入com.pb.Reflect.classinfo.Person

結(jié)果:

========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取構(gòu)造方法信息============private com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取構(gòu)造方法信息結(jié)束============
五、使用反射的步驟5.1、步驟

Java.lang.reflect

  • 獲得想操作類(lèi)的Java.lang.Class對(duì)象
  • 調(diào)用Class的方法
  • 使用反射API來(lái)操作這些信息

5.2、獲取Class對(duì)象方式
  • 調(diào)用某個(gè)對(duì)象的getClass()方法
Person p = new Person();Class cla=p.getClass();
  • 調(diào)用某個(gè)類(lèi)的class屬性來(lái)獲取該類(lèi)對(duì)應(yīng)的Class對(duì)象
Class cls=Person.class;
  • 使用Class類(lèi)的forName()靜態(tài)方法
Class cla=Class.forName(“類(lèi)的全路徑”);
六、第二種方式對(duì)象的getClass()方法

Person類(lèi),因?yàn)橐暶鲗?duì)象所以將構(gòu)造方法public

package com.pb.Reflect.classinfo;public class Person {    private String name;    private String gender;    private int age;        public Person() {    //    }    public Person(String name, String gender, int age) {        super();        this.name = name;        this.gender = gender;        this.age = age;    }    //getter、和setter方法    private String getName() {        return name;    }    private void setName(String name) {        this.name = name;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }        public String toString(){        return "姓名:"+name+"年齡: "+age;    }    }

使用反射:

package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import javax.swing.JOptionPane;/* * 通過(guò)用戶(hù)輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性 * Declared獲取全部不管是私有和公有 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息 */    public ReflectDemo(Person p){        Class cla=p.getClass();        //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合        Method [] method=cla.getDeclaredMethods(); //返回所有的方法        System.out.println("========獲取方法信息============");        for (Method meth : method) {            //遍歷method數(shù)組,并輸出方法信息            System.out.println(meth.toString());        }        System.out.println("========獲取出方法信息結(jié)束============");        //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合         Field [] field=cla.getDeclaredFields();            System.out.println("========獲取成員屬性信息============");            for (Field f : field) {                System.out.println(f.toString());            }            System.out.println("========獲取成員屬性信息結(jié)束============");        //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合            Constructor [] constructor=cla.getDeclaredConstructors();            System.out.println("========獲取成員構(gòu)造方法信息============");            for (Constructor constru : constructor) {                System.out.println(constru.toString());            }            System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============");    }    }

測(cè)試類(lèi)

package com.pb.Reflect.classinfo;public class TestReflection {    public static void main(String[] args) {        Person p=new Person();        ReflectDemo rd=new ReflectDemo(p);    }}

結(jié)果:同上

========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取成員構(gòu)造方法信息============public com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取成員構(gòu)造方法信息結(jié)束============
七、第三種方法類(lèi)的.class屬性

Person類(lèi)同上

測(cè)試類(lèi):

package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class TestReflection {    public static void main(String[] args) {        /*第二種方法        Person p=new Person();        ReflectDemo rd=new ReflectDemo(p);*/                /*         * 第三種方式.class屬性         */        Class cla=Person.class;        //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合                Method [] method=cla.getDeclaredMethods(); //返回所有的方法                System.out.println("========獲取方法信息============");                for (Method meth : method) {                    //遍歷method數(shù)組,并輸出方法信息                    System.out.println(meth.toString());                }                System.out.println("========獲取出方法信息結(jié)束============");                //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合                 Field [] field=cla.getDeclaredFields();                    System.out.println("========獲取成員屬性信息============");                    for (Field f : field) {                        System.out.println(f.toString());                    }                    System.out.println("========獲取成員屬性信息結(jié)束============");                //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合                    Constructor [] constructor=cla.getDeclaredConstructors();                    System.out.println("========獲取成員構(gòu)造方法信息============");                    for (Constructor constru : constructor) {                        System.out.println(constru.toString());                    }                    System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============");    }}

結(jié)果:

同上

========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取成員構(gòu)造方法信息============public com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取成員構(gòu)造方法信息結(jié)束============

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗阳县| 五大连池市| 镇原县| 三台县| 苍梧县| 永福县| 武穴市| 江山市| 西华县| 利辛县| 县级市| 临安市| 章丘市| 盘山县| 城口县| 新丰县| 周口市| 娄烦县| 贵港市| 华安县| 勐海县| 穆棱市| 荥经县| 平潭县| 蒙自县| 湟源县| 宜都市| 新兴县| 泽普县| 阿克苏市| 满城县| 榆社县| 吉木萨尔县| 儋州市| 富阳市| 沅江市| 简阳市| 定州市| 石渠县| 昂仁县| 略阳县|