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

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

JAVA基礎(chǔ)學(xué)習(xí)day27--反射機(jī)制

2019-11-14 15:19:47
字體:
供稿:網(wǎng)友

一、概述

1.1、概述

 

反射的概念:

 

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

 

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

 

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

 

二、反射的3種方式

2.1、3種方式

1.聲明對(duì)象如Person p=new Person,通過對(duì)象的p.getClass()方法

2.每個(gè)類都有一個(gè).class屬性,通過Person.class屬性

3.Class.fromName("類的全路徑"),全路徑包名.類名

2.2、示例

 普通的JAVA類,經(jīng)過了一些修改有私有的方法與公有的方法

package com.pb.entity;public class  Person{    PRivate String name; //姓名    private String gender;//性別    private int age; //年齡    public Person()    {        //公開無參數(shù)構(gòu)造方法        System.out.println("公開無參數(shù)構(gòu)造方法");    }    public Person(String name,String gender,int age)    {        //公開有參數(shù)構(gòu)造方法        System.out.println("公開有參數(shù)構(gòu)造方法");        this.name=name;        this.gender=gender;        this.age=age;    }    //私有構(gòu)造方法    private Person(String name)    {        System.out.println("這是私有的只有name的構(gòu)造方法:"+name);    }    //私有構(gòu)造方法    private Person(String name,int age)    {        System.out.println("這是私有的只有name和age的構(gòu)造方法:"+name+"...."+age);    }    /*    getter、setter方法    */    public void setName(String name)    {        this.name=name;    }    public String getName()    {        return this.name;    }    public void setGender(String gender)    {        this.gender=gender;    }    public String getGender()    {        return this.gender;    }    /*    靜態(tài)方法    */    public static void staticMethod()    {        System.out.println("這是一個(gè)staticMethod方法");    }    /*    私有化方法    */    private void setAge(int age)    {        this.age=age;    }    private int getAge()    {        return this.age;    }    /*    私有的方法    */    private void test()    {        System.out.println("這是私有的test方法");    }    /*    私有的方法    */    private void test(String name,String gender)    {        System.out.println("這是私有的有參數(shù)的方法"+name+"..."+gender);    }    /*        自我介紹的方法    */    public void show()    {        System.out.println("姓名:"+this.name+",性別:"+this.gender+",年齡:"+this.age);    }}

 

測(cè)試類

package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;/*反射的三種方式:1.類.class2.聲明對(duì)象,對(duì)象.getClass()方法如Person p=new Person(); p.getClass();3.Class.forName("類的全路徑");*/class ReflectionDemo1{    public static void main(String[] args) throws Exception    {        reflect_fun1();        System.out.println("=========================");        reflect_fun2();        System.out.println("=========================");        reflect_fun3();        System.out.println("=========================");    }    /*    類.class    */    public static void reflect_fun1()    {    //獲取類對(duì)象,得到一個(gè)Class對(duì)象        Class cla1=Person.class;        Class cla2=Person.class;        System.out.println(cla1==cla2);    }    /*    聲明對(duì)象,對(duì)象.getClass()方法如Person p=new Person(); p.getClass();    */    public static void reflect_fun2()    {        Person p1=new Person();        //通過對(duì)象的getClass()方法        Class cla1=p1.getClass();        Person p2=new Person();        Class cla2=p2.getClass();        System.out.println(cla1==cla2);        }    /*    Class.forName("類的全路徑");    */    public static void reflect_fun3() throws Exception    {        Class cla1=Class.forName("com.pb.entity.Person");        System.out.println(cla1);    }}

 

 

 

三、獲取構(gòu)造方法、方法、屬性

3.1、概述

構(gòu)造方法:

  • 公開的指定:getConstructor("方法名",參數(shù)1.....參數(shù)n),如String.class,要與方法中順序一至,沒有參數(shù)可以不寫
  • 所有公開:getConstructors();返回一個(gè)Constructor [] 數(shù)組
  • 所有:getDeclaredConstructors();返回一個(gè)Constructor [] 數(shù)組
  • 私有:getDeclaredConstructor("方法名",參數(shù)1.....參數(shù)n),

方法:

 

  • 公開的指定:getMethod("方法名",參數(shù)1.....參數(shù)n),如String.class,要與方法中順序一至,沒有參數(shù)可以不寫
  • 所有公開:getMethods();返回一個(gè)Method[] 數(shù)組
  • 所有:getDeclaredMethods();返回一個(gè)Method[] 數(shù)組
  • 私有:getDeclaredMethod("方法名",參數(shù)1.....參數(shù)n),

屬性:

  • 公開的指定:getField("方法名"),如String.class,要與方法中順序一至,沒有參數(shù)可以不寫
  • 所有公開:getFields();返回一個(gè)Method[] 數(shù)組
  • 所有:getDeclaredFields();返回一個(gè)Method[] 數(shù)組
  • 私有:getDeclaredMethod("方法名",參數(shù)1.....參數(shù)n),

 

 

3.2、示例

 

package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;/*獲取公開構(gòu)造方法獲取私有構(gòu)造方法獲取公開的方法獲取私有的方法*/class ReflectionDemo1 {    public static void main(String[] args) throws Exception {        getObj_con1();        System.out.println("=========================");        getObj_con2();        System.out.println("=========================");                getObj_con3();        System.out.println("=========================");                getObj_con4();        System.out.println("=========================");        getObj_meth1();        System.out.println("=========================");        getObj_meth2();        System.out.println("=========================");                getField_meth1();        System.out.println("=========================");    }    /*     * 獲取公開構(gòu)造方法     */    public static void getObj_con1() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        // 獲取無參數(shù)的構(gòu)造方法        Constructor<Person> con = cla.getConstructor();        System.out.println(con);        // 獲取指定參數(shù)的構(gòu)造方法有3個(gè)參數(shù)的構(gòu)造方法        Constructor<Person> cons = cla.getConstructor(String.class, String.class, int.class);        System.out.println(cons);    }    /*     * 獲取私有構(gòu)造方法     */    public static void getObj_con2() throws Exception {        Class  cla = Class.forName("com.pb.entity.Person");        //獲取私有一個(gè)參數(shù)的構(gòu)造方法        Constructor<Person> con1=cla.getDeclaredConstructor(String.class);        System.out.println(con1);        //獲取私有2個(gè)參數(shù)的構(gòu)造方法        Constructor<Person> con2=cla.getDeclaredConstructor(String.class,int.class);        System.out.println(con2);    }    /*     * 獲取全部公有構(gòu)造方法     */    public static void getObj_con3() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        Constructor [] cons=cla.getConstructors();        //遍歷        for(Constructor c:cons)        {                System.out.println(c);        }    }    /*     * 獲取全部構(gòu)造方法包括私有     */    public static void getObj_con4() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        Constructor [] cons=cla.getDeclaredConstructors();        //遍歷        for(Constructor c:cons)        {                System.out.println(c);        }    }    /*     * 獲取公開的方法     */    public static void getObj_meth1() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        //獲取方法名為show的公開方法        Method m1=cla.getMethod("show");        System.out.println(m1);        //獲取setName的方法        Method m2=cla.getMethod("setName", String.class);        System.out.println(m2);                //獲取所有公開的方法包括從Object中繼承的方法        Method [] ms=cla.getMethods();        //遍歷        for(Method m:ms)        {            System.out.println(m);        }    }    /*     * 獲取私有的方法     */    public static void getObj_meth2() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        //獲取指定的私有方法名字為test,有2個(gè)字符串參數(shù)        Method m1=cla.getDeclaredMethod("test", String.class,String.class);        System.out.println(m1);        //也可以獲取SET和get方法        Method m2=cla.getDeclaredMethod("getAge");        System.out.println(m2);        //獲取全部方法包含私有        Method [] ms=cla.getDeclaredMethods();        //遍歷                for(Method m:ms)                {                    System.out.println(m);                }    }    /*     * 獲取屬性     */    public static void getField_meth1() throws Exception{        Class cla = Class.forName("com.pb.entity.Person");        //獲取指定的屬性        Field f1=cla.getDeclaredField("name");        System.out.println(f1);        //有公開的話直接cla.getField(name)        //獲取所有屬性        Field [] fs=cla.getDeclaredFields();        for(Field f:fs){            System.out.println(f);        }            }}

 

結(jié)果

public com.pb.entity.Person()public com.pb.entity.Person(java.lang.String,java.lang.String,int)=========================private com.pb.entity.Person(java.lang.String)private com.pb.entity.Person(java.lang.String,int)=========================public com.pb.entity.Person(java.lang.String,java.lang.String,int)public com.pb.entity.Person()=========================public com.pb.entity.Person(java.lang.String,java.lang.String,int)public com.pb.entity.Person()private com.pb.entity.Person(java.lang.String)private com.pb.entity.Person(java.lang.String,int)=========================public void com.pb.entity.Person.show()public void com.pb.entity.Person.setName(java.lang.String)public void com.pb.entity.Person.show()public void com.pb.entity.Person.setGender(java.lang.String)public java.lang.String com.pb.entity.Person.getGender()public static void com.pb.entity.Person.staticMethod()public java.lang.String com.pb.entity.Person.getName()public void com.pb.entity.Person.setName(java.lang.String)public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public java.lang.String java.lang.Object.toString()public native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()=========================private void com.pb.entity.Person.test(java.lang.String,java.lang.String)private int com.pb.entity.Person.getAge()public void com.pb.entity.Person.show()private int com.pb.entity.Person.getAge()public void com.pb.entity.Person.setGender(java.lang.String)public java.lang.String com.pb.entity.Person.getGender()public static void com.pb.entity.Person.staticMethod()private void com.pb.entity.Person.setAge(int)public java.lang.String com.pb.entity.Person.getName()public void com.pb.entity.Person.setName(java.lang.String)private void com.pb.entity.Person.test(java.lang.String,java.lang.String)private void com.pb.entity.Person.test()=========================private java.lang.String com.pb.entity.Person.nameprivate java.lang.String com.pb.entity.Person.nameprivate java.lang.String com.pb.entity.Person.genderprivate int com.pb.entity.Person.age=========================

 

 

四、創(chuàng)建對(duì)象

4.1、概述

兩種創(chuàng)建對(duì)象的方式

  • 使用指定構(gòu)造方法創(chuàng)建對(duì)象
  • 使用newIntance()創(chuàng)建對(duì)象,這個(gè)方法要求類必須有默認(rèn)的構(gòu)造方法,空參數(shù)構(gòu)造方法

4.2、示例

 

package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;public class ReflectDemo2 {    public static void main(String[] args) throws Exception{        createObj1();        System.out.println("===============");        createObj2();        System.out.println("===============");    }    /*     * 使用構(gòu)造方法創(chuàng)建對(duì)象     */    public static void createObj1() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");        //獲取指定的構(gòu)造方法 3 個(gè)參數(shù)的參數(shù)方法        Constructor con=cla.getConstructor(String.class,String.class,int.class);        Person p=(Person) con.newInstance("張三","男",20);        p.show();    }    /*     * 使用newInstance創(chuàng)建對(duì)象     */    public static void createObj2() throws Exception {        Class cla = Class.forName("com.pb.entity.Person");                Person p=(Person) cla.newInstance();        p.show();    }}

 

 

 

結(jié)果:

 

公開有參數(shù)構(gòu)造方法姓名:張三,性別:男,年齡:20===============公開無參數(shù)構(gòu)造方法姓名:null,性別:null,年齡:0===============

 

五、使用setter與getter

5.1、概述

 

invoke(Object obj, Object... args)
          對(duì)帶有指定參數(shù)的指定對(duì)象調(diào)用由此 Method 對(duì)象表示的底層方法。

setaccessible(boolean flag)
          將此對(duì)象的 accessible 標(biāo)志設(shè)置為指示的布爾值。

true表示可以設(shè)置,默認(rèn)為false

只針對(duì)私有private修飾的需要設(shè)置

 

 

5.2、示例

 

package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;/** *  * 使用反射,調(diào)用setter與getter方法 * */public class ReflectDemo3 {    public static void main(String[] args)throws Exception {        setAndGet();    }    public static void setAndGet() throws Exception{        Class cla = Class.forName("com.pb.entity.Person");        //創(chuàng)建對(duì)象        Person p=(Person) cla.newInstance();                //獲取setter方法        Method setName=cla.getMethod("setName", String.class);        //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值        setName.invoke(p, "張三");        Method setGender=cla.getMethod("setGender", String.class);        //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值        setGender.invoke(p, "女");        Method setAge=cla.getDeclaredMethod("setAge", int.class);        //因?yàn)槭撬接械陌褭?quán)限打開才開以賦值        setAge.setAccessible(true);        //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值        setAge.invoke(p, 32);        //獲取show方法        Method show=cla.getMethod("show");        //調(diào)用方法        show.invoke(p);        //多個(gè)參數(shù),可以寫NULL,也可以不寫返回一個(gè)Objec類,這個(gè)方法因?yàn)橐呀?jīng)輸出                                }}

 

 

 

六、動(dòng)態(tài)創(chuàng)建數(shù)組

 

6.1、概述

java.lang.reflect.Array

6.2、示例

/*通過反射創(chuàng)建數(shù)組創(chuàng)建一維數(shù)組或二維數(shù)組1.通過Array.netInstance(類型.class,長度1,....長度n)2.通過setXXX(數(shù)組名,下標(biāo),值)方法可以賦值3.通過getXXX(數(shù)組名,下標(biāo))方法可以獲取值*/import java.lang.reflect.*;class ReflectArray1 {    public static void main(String[] args)     {        createArray1();        System.out.println("=====================");        createArray2();    }    /*    反射創(chuàng)建一個(gè)String類型長度為10的一維數(shù)組    */    public static void createArray1()    {        Object arr=Array.newInstance(String.class,10);        //為其中一些下標(biāo)元素賦值        Array.set(arr,3,"hello");        Array.set(arr,5,"java");        Array.set(arr,7,"reflect");        Array.set(arr,8,"Array");        Array.set(arr,9,"!");        //獲取值        Object o0=Array.get(arr,0);         Object o1=Array.get(arr,1);         Object o2=Array.get(arr,2);         Object o3=Array.get(arr,3); //下標(biāo)為3的元素        Object o4=Array.get(arr,4);         Object o5=Array.get(arr,5);         Object o6=Array.get(arr,6);         Object o7=Array.get(arr,7);         Object o8=Array.get(arr,8);         Object o9=Array.get(arr,9);         //強(qiáng)制轉(zhuǎn)換        String [] str=(String[])arr;        for(String s:str)        {            System.out.println(s);        }    }    /*    反射創(chuàng)建一個(gè)int類型長度為5,10的二維數(shù)組    */    public static void createArray2()    {        Object arr=Array.newInstance(int.class,5,10);        //設(shè)置值        //獲取一數(shù)組的下標(biāo)        Object firstIndex1=Array.get(arr,3);        //為二維數(shù)組下標(biāo)一個(gè)元素設(shè)置值        Array.setInt(firstIndex1,6,9);        Object firstIndex2=Array.get(arr,1);        //為二維數(shù)組下標(biāo)一個(gè)元素設(shè)置值        Array.setInt(firstIndex2,2,2);        //強(qiáng)轉(zhuǎn)        int [] [] arrs=(int [] [])arr;        for(int x=0;x<arrs.length;x++)        {            for(int y=0;y<arrs[x].length;y++){                System.out.print(arrs[x][y]+",");            }            System.out.println();        }                }}

 



 

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠东县| 婺源县| 衡南县| 南宁市| 耒阳市| 喜德县| 丰城市| 怀集县| 佛冈县| 卢氏县| 泰安市| 台前县| 南昌市| 昆山市| 阿图什市| 五峰| 溆浦县| 普兰店市| 岫岩| 安化县| 迁安市| 津市市| 石家庄市| 五指山市| 聊城市| 巴塘县| 双江| 青州市| 华坪县| 宁陕县| 女性| 专栏| 祁东县| 青田县| 怀宁县| 三都| 禹城市| 志丹县| 镇远县| 伊春市| 奉节县|