亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java類加載和反射介紹

2019-11-06 06:27:41
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,那么就可以通過反射機制來獲得類的所有信息.反射機制的優點就是可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中它的靈活性就表現的十分明顯。

當程序主動使用某個類時,若該類還沒加載到內存中,系統會通過加載,鏈接,初始化3個操作對類進行初始化。類字面常量”,class”創建Class對象的引用時,不會自動地初始化該Class對象,準備工作包含3個步驟:1.加載:由類加載器執行,該步驟查找字節碼,并從這些字節碼中創建一個Class對象2.鏈接:在鏈接階段將驗證類中的字節碼,為靜態域分配存儲空間,并且如果必需的話,將解析這個類創建的對其他類的所有引用。3.初始化:如果該類有超類,則對其初始化,執行靜態初始化器和靜態初始化塊

類的初始化時機1.創建類的實例2.訪問類或接口的靜態變量(static final常量除外,static final變量可以)3.調用類的靜態方法4.反射(Class.forName(packageName.className))5.初始化類的子類(子類初始化問題:滿足主動調用,即訪問子類中的靜態變量、方法,否則僅父類初始化)6.java虛擬機啟動時被標明為啟動類的類注:加載順序:啟動類的static block最先加載(父類靜態成員、靜態代碼塊—>子類靜態成員、靜態代碼塊—>父類實例成員、代碼塊——>父類構造函數—>子類實例成員、代碼塊—>子類構造函數)

我們需要明白在JAVA中任何class都要裝載在虛擬機上才能運行,而forClass就是裝載類用的,這是要和new不一樣,要分清楚哦。A a = (A)Class.forName(“package.A”).newInstance();和 A a = new A;是等價的。記住一個概念,靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼,而且以后不會再走這套靜態代碼了。Class.forName(xxx.xx.xx)的作用是要求JVM查找并加載指定的類,也即是說JVM會執行該類的靜態代碼段。

JAVA中獲取Class對象有3種方式:1.Class.forName()2.Object.getClass()3.類字面常量 xx.class

代碼例子:

復制代碼
package Reflect;class Demo{    //other codes...} class hello{    public static void main(String[] args) {        Class<?> demo1=null;        Class<?> demo2=null;        Class<?> demo3=null;        try{            //一般盡量采用這種形式            demo1=Class.forName("Reflect.Demo");        }catch(Exception e){            e.PRintStackTrace();        }        demo2=new Demo().getClass();        demo3=Demo.class;                 System.out.println("類名稱   "+demo1.getName());//Reflect.Demo        System.out.println("類名稱   "+demo2.getName());//Reflect.Demo        System.out.println("類名稱   "+demo3.getName());//Reflect.Demo            }}復制代碼

 

從Class中獲取信息(可以查看Class的API文檔了解):

獲取類的構造器 首先介紹一下Constructor類,這個類用來封裝反射得到的構造器,Class有四個方法來獲得Constructor對象public Constructor<?>[] getConstructors() 返回類中所有的public構造器集合,默認構造器的下標為0public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public構造器,參數為構造器參數類型集合public Constructor<?>[] getDeclaredConstructors() 返回類中所有的構造器,包括私有public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的構造器

獲取類的成員變量 成員變量用Field類進行封裝,主要的方法非常的類似:public Field getDeclaredField(String name) 獲取任意指定名字的成員public Field[] getDeclaredFields() 獲取所有的成員變量public Field getField(String name) 獲取任意public成員變量public Field[] getFields() 獲取所有的public成員變量

獲取類的方法 public Method[] getMethods() 獲取所有的共有方法的集合public Method getMethod(String name,Class<?>... parameterTypes) 獲取指定公有方法 參數1:方法名 參數2:參數類型集合 public Method[] getDeclaredMethods() 獲取所有的方法public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 獲取任意指定方法

常用的就這些,知道這些,其他的都好辦……

 

獲取基本信息的例子:

復制代碼
import java.lang.reflect.*;import java.lang.annotation.*;//使用2個注釋修飾該類@SuppressWarnings(value="unchecked")@Deprecatedpublic class ClassTest{    //為該類定義一個私有的構造器    private ClassTest(){    }        //定義一個有參數的構造器    public ClassTest(String name){        System.out.println("執行有參數的構造器");    }        //定義一個無參數的info方法    public void info(){        System.out.println("執行無參數的info方法");    }        //定義一個有參數的info方法    public void info(String str){        System.out.println("執行有參數的info方法"            + ",其實str參數值:" + str);    }        //定義一個測試用的內部類    class Inner{    }        public static void main(String[] args) throws Exception{        //下面代碼可以獲取ClassTest對應的Class        Class<ClassTest> clazz = ClassTest.class;                //獲取該Class對象所對應類的全部構造器        Constructor[] ctors = clazz.getDeclaredConstructors();        System.out.println("ClassTest的全部構造器如下:");        for (Constructor c : ctors)        {            System.out.println(c);            //private ClassTest()            //public ClassTest(java.lang.String)        }                        //獲取該Class對象所對應類的全部public構造器        Constructor[] publicCtors = clazz.getConstructors();        System.out.println("ClassTest的全部public構造器如下:");        for (Constructor c : publicCtors)        {            System.out.println(c);            //public ClassTest(java.lang.String)        }                //獲取該Class對象所對應類的全部public方法        Method[] mtds = clazz.getMethods();        System.out.println("ClassTest的全部public方法如下:");        for (Method md : mtds)        {            System.out.println(md);            //public static void ClassTest.main(java.lang.String[]) throws java.lang.Exception            //public void ClassTest.info()            //public void ClassTest.info(java.lang.String)            //public final void java.lang.Object.wait() throws java.lang.InterruptedException            //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException            //public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException            //public native int java.lang.Object.hashCode()            //public final native java.lang.Class java.lang.Object.getClass()            //public boolean java.lang.Object.equals(java.lang.Object)            //public java.lang.String java.lang.Object.toString()            //public final native void java.lang.Object.notify()            //public final native void java.lang.Object.notifyAll()        }                //獲取該Class對象所對應類的指定方法        System.out.println("ClassTest里帶一個字符串參數的info方法為:"            + clazz.getMethod("info" , String.class));        //public void ClassTest.info(java.lang.String)                //獲取該Class對象所對應類的上的全部注釋        Annotation[] anns = clazz.getAnnotations();        System.out.println("ClassTest的全部Annotattion如下:");        for (Annotation an : anns)        {            System.out.println(an);        }                System.out.println("該Class元素上的@SuppressWarnings注釋為:"            + clazz.getAnnotation(SuppressWarnings.class));                //獲取該Class對象所對應類的全部內部類        Class<?>[] inners = clazz.getDeclaredClasses();        System.out.println("ClassTest的全部內部類如下:");        for (Class c : inners)        {            System.out.println(c);            //class ClassTest$Inner        }                //使用Class.forName方法加載ClassTest的Inner內部類        Class inClazz = Class.forName("ClassTest$Inner");                //通過getDeclaringClass()訪問該類所在的外部類        System.out.println("inClazz對應類的外部類為:" + inClazz.getDeclaringClass());        //class ClassTest        System.out.println("ClassTest的包為:" + clazz.getPackage());        //null        System.out.println("ClassTest的父類為:" + clazz.getSuperclass());        //class java.lang.Object    }}復制代碼

 

通過Class調用其他類中的構造函數 (也可以通過這種方式通過Class創建其他類的對象)

復制代碼
package Reflect; import java.lang.reflect.Constructor; class Person{         public Person() {             }    public Person(String name){        this.name=name;    }    public Person(int age){        this.age=age;    }    public Person(String name, int age) {        this.age=age;        this.name=name;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    @Override    public String toString(){        return "["+this.name+"  "+this.age+"]";    }    private String name;    private int age;} class hello{    public static void main(String[] args) {        Class<?> demo=null;        try{            demo=Class.forName("Reflect.Person");        }catch (Exception e) {            e.printStackTrace();        }        Person per1=null;        Person per2=null;        Person per3=null;        Person per4=null;        //取得全部的構造函數        Constructor<?> cons[]=demo.getConstructors();        try{            per1=(Person)cons[0].newInstance();            per2=(Person)cons[1].newInstance("Rollen");            per3=(Person)cons[2].newInstance(20);            per4=(Person)cons[3].newInstance("Rollen",20);        }catch(Exception e){            e.printStackTrace();        }        System.out.println(per1);//[null  0]        System.out.println(per2);//[Rollen  0]        System.out.println(per3);//[null  20]        System.out.println(per4);//[Rollen  20]    }}復制代碼復制代碼
綜合例子:package Reflect; interface China{    public static final String name="Rollen";    public static int age=20;    public void sayChina();    public void sayHello(String name, int age);} class Person implements China{    public Person() {    }    public Person(String sex){        this.sex=sex;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    @Override    public void sayChina(){        System.out.println("hello ,china");    }    @Override    public void sayHello(String name, int age){        System.out.println(name+"  "+age);    }    private String sex;} class hello{    public static void main(String[] args) {        Class<?> demo=null;        try{            demo=Class.forName("Reflect.Person");        }catch (Exception e) {            e.printStackTrace();        }                //保存所有的接口        Class<?> intes[]=demo.getInterfaces();        for (int i = 0; i < intes.length; i++) {            System.out.println("實現的接口   "+intes[i].getName());            // Reflect.China        }                //獲得其他類中的全部構造函數        Constructor<?>cons[]=demo.getConstructors();        for (int i = 0; i < cons.length; i++) {            System.out.println("構造方法:  "+cons[i]);            //public Reflect.Person()            /public Reflect.Person(java.lang.String)        }                for (int i = 0; i < cons.length; i++) {            Class<?> p[]=cons[i].getParameterTypes();            System.out.print("構造方法:  ");            int mo=cons[i].getModifiers();            System.out.print(Modifier.toString(mo)+" ");            System.out.print(cons[i].getName());            System.out.print("(");            for(int j=0;j<p.length;++j){                System.out.print(p[j].getName()+" arg"+i);                if(j<p.length-1){                    System.out.print(",");                }            }            System.out.println("){}");        }        //構造方法:  public Reflect.Person(){}        //構造方法:  public Reflect.Person(java.lang.String arg1){}                //通過反射調用其他類中的方法        try{            //調用Person類中的sayChina方法            Method method=demo.getMethod("sayChina");            method.invoke(demo.newInstance());//hello ,china            //調用Person的sayHello方法            method=demo.getMethod("sayHello", String.class,int.class);            method.invoke(demo.newInstance(),"Rollen",20);//Rollen  20                     }catch (Exception e) {            e.printStackTrace();        }                        System.out.println("===============本類屬性========================");        // 取得本類的全部屬性        Field[] field = demo.getDeclaredFields();        for (int i = 0; i < field.length; i++) {            // 權限修飾符            int mo = field[i].getModifiers();            String priv = Modifier.toString(mo);            // 屬性類型            Class<?> type = field[i].getType();            System.out.println(priv + " " + type.getName() + " "                    + field[i].getName() + ";");            //private java.lang.String sex;                }        System.out.println("===============實現的接口或者父類的屬性========================");        // 取得實現的接口或者父類的屬性        Field[] filed1 = demo.getFields();        for (int j = 0; j < filed1.length; j++) {            // 權限修飾符            int mo = filed1[j].getModifiers();            String priv = Modifier.toString(mo);            // 屬性類型            Class<?> type = filed1[j].getType();            System.out.println(priv + " " + type.getName() + " "                    + filed1[j].getName() + ";");        }        //public static final java.lang.String name;        //public static final int age;                Object obj = null;        try{         obj=demo.newInstance();        }catch (Exception e) {            e.printStackTrace();        }                                //通過反射操作屬性        Field field = demo.getDeclaredField("sex");        field.setaccessible(true);        field.set(obj, "男");                //通過反射取得并修改數組的信息:        int[] temp={1,2,3,4,5};        Class<?>demo=temp.getClass().getComponentType();        System.out.println("數組類型: "+demo.getName());// int        System.out.println("數組長度  "+Array.getLength(temp));//5        System.out.println("數組的第一個元素: "+Array.get(temp, 0));//1        Array.set(temp, 0, 100);        System.out.println("修改之后數組第一個元素為: "+Array.get(temp, 0));//100    }}復制代碼

 

將反射用于工廠模式(結合屬性文件的工廠模式):

首先創建一個fruit.properties的資源文件,內容為:apple=Reflect.Appleorange=Reflect.Orange

主類代碼:

復制代碼
package Reflect; import java.io.*;import java.util.*; interface fruit{    public abstract void eat();} class Apple implements fruit{    public void eat(){        System.out.println("Apple");    }} class Orange implements fruit{    public void eat(){        System.out.println("Orange");    }} //操作屬性文件類class init{    public static Properties getPro() throws FileNotFoundException, IOException{        Properties pro=new Properties();        File f=new File("fruit.properties");        if(f.exists()){            pro.load(new FileInputStream(f));        }else{            pro.setProperty("apple", "Reflect.Apple");            pro.setProperty("orange", "Reflect.Orange");            pro.store(new FileOutputStream(f), "FRUIT CLASS");        }        return pro;    }} class Factory{    public static fruit getInstance(String ClassName){        fruit f=null;        try{            f=(fruit)Class.forName(ClassName).newInstance();        }catch (Exception e) {            e.printStackTrace();        }        return f;    }}class hello{    public static void main(String[] a) throws FileNotFoundException, IOException{        Properties pro=init.getPro();        fruit f=Factory.getInstance(pro.getProperty("apple"));        if(f!=null){            f.eat();//Apple        }    }}復制代碼

學習Java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女精品视频免费观看| 69国产精品成人在线播放| 日韩精品黄色网| 8090成年在线看片午夜| 亚洲精品一区二三区不卡| 九九久久精品一区| 欧美视频在线观看 亚洲欧| 欧美一区二区大胆人体摄影专业网站| 久久综合久久88| 久久精品中文字幕免费mv| 最近2019中文字幕大全第二页| 日产精品久久久一区二区福利| 国产精品夜间视频香蕉| 青青a在线精品免费观看| 欧美在线视频一二三| 日本韩国在线不卡| 中文字幕在线成人| 中文日韩在线视频| 欧美午夜电影在线| 91免费欧美精品| 欧美激情一区二区三区久久久| 色一情一乱一区二区| 亚洲三级 欧美三级| 国产美女久久精品| 亚洲欧美另类在线观看| 国产精品网红直播| 精品女同一区二区三区在线播放| 国产精品美女主播在线观看纯欲| 国产欧美一区二区三区久久| 亚洲精品永久免费精品| 欧美激情欧美激情| 国产在线a不卡| 欧美激情一区二区三区成人| 国产精品一香蕉国产线看观看| 久久久久北条麻妃免费看| 青青草原成人在线视频| 久久精品99久久香蕉国产色戒| 日韩欧美国产视频| zzjj国产精品一区二区| 亚洲va欧美va在线观看| 中文字幕精品在线视频| 欧美午夜精品久久久久久浪潮| 国产精品久久久久久久久久| 欧美成人国产va精品日本一级| 亚洲xxx大片| 欧美裸体男粗大视频在线观看| 北条麻妃一区二区三区中文字幕| 在线日韩日本国产亚洲| 国产一区私人高清影院| 成人黄色免费网站在线观看| 久久天天躁狠狠躁夜夜躁2014| 午夜免费久久久久| 一本色道久久88亚洲综合88| 日韩va亚洲va欧洲va国产| 欧美日韩色婷婷| 欧美最近摘花xxxx摘花| 国产欧美日韩精品丝袜高跟鞋| 国产精品久久久久久久久久三级| 97精品视频在线播放| 成人写真福利网| 国产精品揄拍一区二区| 国产女同一区二区| 成人信息集中地欧美| 日韩精品高清在线观看| 日本成人黄色片| 九九久久久久99精品| 欧美午夜宅男影院在线观看| 国产精品福利久久久| 国产在线视频欧美| 成人中文字幕+乱码+中文字幕| 亚洲第一中文字幕在线观看| 亚洲精品综合精品自拍| 欧美最猛性xxxxx免费| 韩国视频理论视频久久| www.亚洲一区| 国产精品18久久久久久麻辣| 日韩成人av在线| 国产精品电影久久久久电影网| 久久成年人免费电影| 日本高清久久天堂| 久久久之久亚州精品露出| 国产亚洲a∨片在线观看| 精品亚洲一区二区三区四区五区| 26uuu国产精品视频| 久久精品视频免费播放| 欧美剧在线观看| 中文字幕精品www乱入免费视频| 国产精品狼人色视频一区| 国产日韩欧美91| 成人av色在线观看| 97香蕉超级碰碰久久免费软件| 国产极品精品在线观看| 日韩在线播放av| 欧美视频在线观看免费| 欧美激情一区二区三级高清视频| 欧美激情综合色| 日韩欧美在线第一页| 在线观看视频亚洲| 亚洲精品国精品久久99热| 美日韩精品视频免费看| 亚洲最新av网址| 久久91超碰青草是什么| 伊人青青综合网站| 欧美性jizz18性欧美| 91成人免费观看网站| 亚洲精品久久久久中文字幕欢迎你| 狠狠久久亚洲欧美专区| 欧美日韩不卡合集视频| 26uuu国产精品视频| 日本欧美黄网站| 日韩人在线观看| 亚洲国产天堂久久综合网| 成人精品一区二区三区电影免费| 欧美激情免费观看| 欧美激情视频网站| 欧美第一黄网免费网站| 97精品伊人久久久大香线蕉| 一二美女精品欧洲| 成人精品视频在线| 久久久久久国产精品三级玉女聊斋| 久久视频免费观看| 久久天天躁夜夜躁狠狠躁2022| 国产精品99久久久久久www| 久久精品视频免费播放| 日韩中文在线观看| 国产精品日韩在线播放| 亚洲精品久久久久中文字幕欢迎你| 欧美诱惑福利视频| 亚洲免费av电影| 精品欧美一区二区三区| 亚洲日本中文字幕免费在线不卡| 丝袜亚洲另类欧美重口| 97视频在线免费观看| 亚洲色图校园春色| 98视频在线噜噜噜国产| 欧美激情久久久久| 国产91色在线免费| 日韩精品中文字幕久久臀| 国产精品99久久99久久久二8| 一区二区三区四区在线观看视频| 久久免费成人精品视频| 少妇av一区二区三区| 欧美成人精品不卡视频在线观看| 中文字幕久热精品视频在线| 亚洲精品电影网在线观看| 亚洲国产成人精品一区二区| 这里只有精品在线观看| 国产亚洲精品美女| 欧美黑人国产人伦爽爽爽| 亚洲欧美另类自拍| 久久久久久国产精品三级玉女聊斋| 美女撒尿一区二区三区| 色与欲影视天天看综合网| 91精品国产91久久久久久久久| 91系列在线观看| 国产综合在线观看视频| 欧美老女人bb| 91sao在线观看国产| 亚洲加勒比久久88色综合| 97久久国产精品| 欧美极品少妇与黑人| 国产精品色婷婷视频| 精品久久香蕉国产线看观看gif| 九九综合九九综合|