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

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

Java從零開始學(xué)四十一(反射簡述二)

2019-11-14 23:22:10
字體:
供稿:網(wǎng)友
java從零開始學(xué)四十一(反射簡述二)一、實(shí)例化Class類對象實(shí)例化Class類對象的方法有三種:
  • 第一種:通過forName()方法
  • 第二種:類.class
  • 第三種:對象.getClass()
二、Class類的常用方法
No.方法類型描述
1public static Class<?> forName(String className) throws ClassNotFoundException普通傳入完整的“包.類”名稱實(shí)例化Class對象
2public Constructor[] getConstructors() throws SecurityException普通得到一個(gè)類中的全部構(gòu)造方法
3public Field[] getDeclaredFields() throws SecurityException普通得到一個(gè)類父類中的全部屬性
4public Field[] getFields() throws SecurityException普通取得本類的全部屬性
5public Method[] getMethods() throws SecurityException普通得到一個(gè)類中的全部方法
6public Method getMethod(String name,Class... parameterTypes)throws NoSuchMethodException,SecurityException普通返回一個(gè)Method對象,并設(shè)置一個(gè)方法中的所有參數(shù)類型
7public Class[] getInterfaces()普通得到一個(gè)類中所實(shí)現(xiàn)的全部接口
8public String getName()普通得到一個(gè)類完整的“包.類”名稱
9public Package getPackage()普通得到一個(gè)類的包
10public Class getSuperclass()普通得到一個(gè)類的父類
11public Object newInstance() throws InstantiationException,IllegalaccessException普通根據(jù)Class定義的類實(shí)例化對象
12public Class<?> getComponentType()普通返回表示數(shù)組類型的Class
13public boolean isArray()普通判斷此Class是否是一個(gè)數(shù)組

三、獲取類的信息
package com.pb.reflect;/* * 1.包 * 2.注解 * 3.構(gòu)造方法 * 4.方法 * 5.內(nèi)部類 */@DePRecatedpublic class ReflectDemo2 {    //私有的構(gòu)造方法    private ReflectDemo2(){};    //公有的帶一個(gè)一個(gè)name屬性的構(gòu)造方法    public ReflectDemo2(String name){            };    //無參數(shù)的info方法    public void info(){};    //有參數(shù)的info方法    public void info(String str){};    //內(nèi)部類    class inner{};    }

測試類

package demo;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import com.pb.reflect.ReflectDemo2;public class Demo3 {    public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException {        //獲取ReflectDemo2的Class對象        Class<ReflectDemo2> cla=ReflectDemo2.class;        //獲取ReflectDemo2中全部構(gòu)造方法        Constructor[] constructors=cla.getDeclaredConstructors();        for (Constructor con : constructors) {            System.out.println(con);        }        //獲取指定的公有構(gòu)造方法        System.out.println("====獲取指定的公有構(gòu)造方法========");        Constructor []  pub=cla.getConstructors();        for (Constructor c : pub) {            System.out.println(c.toString());        }        //獲取公有的方法        System.out.println("====獲取公有的方法======");        Method [] methods=cla.getMethods();        for (Method meth : methods) {            System.out.println(meth.toString());        }        //獲取指定方法        System.out.println("====獲取指定的的方法======");        //獲取info不帶參數(shù)方法        Method method=cla.getMethod("info",null);        System.out.println(method.toString());        //獲取info帶一個(gè)String參數(shù)的方法        Method meth=cla.getMethod("info", String.class);        System.out.println(meth.toString());        System.out.println("=====獲取注釋=======");        Annotation [] annotations=cla.getAnnotations();        for (Annotation anno : annotations) {            System.out.println(anno.toString());        }        //獲取得包信息        System.out.println("=====獲取得包信息=======");        Package pack=cla.getPackage();        System.out.println(pack.toString());        //獲取內(nèi)部類        System.out.println("=====獲取內(nèi)部類=======");        Class [] clas=cla.getDeclaredClasses();        for (Class c : clas) {            System.out.println(c.toString());        }        System.out.println("=====獲取父類=======");        Class class2=cla.getSuperclass();        System.out.println(class2.toString());        //獲取內(nèi)部類的對象        Class innercla=Class.forName("com.pb.reflect.ReflectDemo2$inner");        System.out.println("內(nèi)部類對應(yīng)的外部類:"+innercla.getDeclaringClass());        System.out.println("內(nèi)部類的包:"+innercla.getPackage());        System.out.println("內(nèi)部類的父類:"+innercla.getSuperclass());    }}
四、創(chuàng)建對象

直接使用newInstance方法創(chuàng)建對象

package demo;import java.util.Date;public class Demo4 {    public static void main(String[] args) throws InstantiationException, IllegalAccessException {        //獲取Date類的Class對象        Class cla=Date.class;        //使用newInstrance方法創(chuàng)建對象    Date date=(Date) cla.newInstance();    System.out.println(date.toString());    }}

指定的構(gòu)造方法創(chuàng)建對象

package demo;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.util.Date;public class Demo4 {    public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {        //獲取Date類的Class對象        Class cla=Date.class;        //獲取指定參數(shù)的構(gòu)造方法帶一個(gè)長整型參數(shù)的構(gòu)造方法        Constructor constructor=cla.getConstructor(long.class);        //使用newInstrance方法創(chuàng)建對象    Date date=(Date) constructor.newInstance(1999);    System.out.println(date.toString());    }}
五、調(diào)用方法

package com.pb.reflect;public class Person {    private String name;    private String gender;    private int age;        public String getName() {        return name;    }    public 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 getSay(){        return this.name+" /t"+this.gender+"/t"+this.age;    }}

測試類

package demo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import com.pb.reflect.Person;public class Demo6 {    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {        //得到Person類的Class對象        Class cla=Person.class;        //聲明一個(gè)Person對象        Person p=new Person();        //調(diào)用setName方法        Method method=cla.getMethod("setName", String.class);        //使用invoke賦值        method.invoke(p, "張三");        //調(diào)用setGender方法        Method setGender=cla.getMethod("setGender", String.class);        setGender.invoke(p, "女");        //調(diào)用setAge方法        Method setAge=cla.getMethod("setAge", int.class);        setAge.invoke(p, 23);        //調(diào)用get方法 get方法沒有參數(shù)設(shè)置為null        Method getName=cla.getMethod("getName", null);        Object o=getName.invoke(p, null);        System.out.println(o.toString());        Method getGender=cla.getMethod("getGender", null);        Object    o1=getGender.invoke(p, null);        System.out.println(o1.toString());        Method getAge=cla.getMethod("getAge", null);        Object o2=getAge.invoke(p, null);        System.out.println(o2.toString());        Method say=cla.getMethod("getSay", null);        Object o3=say.invoke(p, null);        System.out.println(o3.toString());    }}

結(jié)果:

張三女23張三     女    23

六、調(diào)用屬性

package com.pb.reflect;public class Person {    private String name;    private String gender;    private int age;        public String getName() {        return name;    }    public 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 getSay(){        return"姓名:"+this.name+" /t性別:"+this.gender+"/t年齡:"+this.age;    }}

測試類

package demo1;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Calendar;import com.pb.reflect.Person;public class Test2 {    public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {        //聲明Person對象        Person p=new Person();        //通過反射重到Person的Class對象        Class cla=Person.class;        //因?yàn)镻erson類的屬性都是私有的要用getDeclaredField        Field name=cla.getDeclaredField("name");        //臨時(shí)取消權(quán)限檢查        name.setAccessible(true);        name.set(p, "張三豐");        //獲取年齡        Field gender=cla.getDeclaredField("gender");        //臨時(shí)取消權(quán)限檢查        gender.setAccessible(true);        //賦值        gender.set(p, "男");        //獲取年齡        Field age=cla.getDeclaredField("age");        age.setAccessible(true);        age.setInt(p, 108);        //獲取say方法        Method getSay=cla.getMethod("getSay", null);        Object o=getSay.invoke(p, null);        System.out.println(o.toString());    }}

實(shí)際在在使用已知類時(shí)沒有必要使用反射,只有在程序需要?jiǎng)討B(tài)創(chuàng)建某個(gè)類的對象的時(shí)候我們才會(huì)考慮使用反射

七、動(dòng)態(tài)創(chuàng)建和訪問數(shù)組

package demo1;import java.lang.reflect.Array;public class ArrayTest1 {    /**     * 動(dòng)態(tài)創(chuàng)建數(shù)組和訪問數(shù)組     */    public static void main(String[] args) {        //創(chuàng)建一個(gè)類型為String 的數(shù)組長度為10        Object arr=Array.newInstance(String.class, 10);        //依次為arr賦值        Array.set(arr, 0, "一");        Array.set(arr, 1, "二");        Array.set(arr, 2, "三");        Array.set(arr, 3, "四");        Array.set(arr, 4, "五");        Array.set(arr,5, "六");        Array.set(arr, 6, "七");        Array.set(arr, 7, "八");        Array.set(arr, 8, "九");        Array.set(arr, 9, "十");                //獲取值        Object o8=Array.get(arr, 8);        System.out.println("數(shù)組 中下標(biāo)為8的值為"+o8);        Object o2=Array.get(arr, 2);        System.out.println("數(shù)組 中下標(biāo)為2的值為"+o2);            }}
public static void main(String[] args) {        // 創(chuàng)建一個(gè)一維數(shù)組        Object arr1=Array.newInstance(int.class, 10);        //為下標(biāo)為5,和8的賦值        Array.setInt(arr1, 5, 5);        Array.setInt(arr1, 8, 8);        //查看相應(yīng)位置的內(nèi)容        System.out.println(Array.get(arr1, 5));        System.out.println(Array.get(arr1, 8));    }

創(chuàng)建多維數(shù)組

package demo1;import java.lang.reflect.Array;public class ArrayTest2 {    /**     * 使用Array類創(chuàng)建二維數(shù)組     */    public static void main(String[] args) {        // 創(chuàng)建一個(gè)二維數(shù)組5,10        Object arr1=Array.newInstance(String.class, 5,10);        //為二維數(shù)組賦值        //首先獲取一維的維靈敏        Object firstIndex=Array.get(arr1, 4);        //4,6賦值        Array.set(firstIndex, 6,"張三");        //為3,8賦值        Object new_firstindex=Array.get(arr1, 3);        Array.set(new_firstindex, 8, "李四");        //值輸出        //將arr1數(shù)組強(qiáng)轉(zhuǎn)為2維數(shù)組        String [][] str=(String [][])arr1;        System.out.println(str[4][6]);        System.out.println(str[3][8]);    }}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 营口市| 余江县| 始兴县| 崇阳县| 安吉县| 宝山区| 无锡市| 巴青县| 额尔古纳市| 黄冈市| 澄城县| 调兵山市| 揭阳市| 洛浦县| 图木舒克市| 盘山县| 察哈| 嘉鱼县| 长阳| 济南市| 手机| 许昌县| 庆阳市| 满洲里市| 黄龙县| 中西区| 米林县| 白山市| 梨树县| 搜索| 云浮市| 浦城县| 霍林郭勒市| 新巴尔虎左旗| 永康市| 英德市| 蓬溪县| 梓潼县| 平湖市| 中超| 乌鲁木齐市|