麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

你需要理解的 Java 反射機(jī)制知識(shí)總結(jié)

2019-11-14 08:56:29
字體:
供稿:網(wǎng)友

學(xué)習(xí)java的同學(xué)注意了!!! 學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!

反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。【翻譯于 官方文檔】

本篇將從以下幾個(gè)方面講述反射的知識(shí):

class 的使用方法的反射構(gòu)造函數(shù)的反射成員變量的反射

一、什么是class類

在面向?qū)ο蟮氖澜缋铮f物皆對象。類是對象,類是java.lang.Class類的實(shí)例對象。另外class類只有java虛擬機(jī)才能new出來。任何一個(gè)類都是Class 類的實(shí)例對象。這實(shí)例對象有三種表達(dá)方式:

public class User{}public class ClassTest{User u=new User(); //方式1: Class c1=User.class;//方式2:Class c2=u.getClass();//方式3:Class c3=Class.forName("com.forezp.User");//可以通過類的類型創(chuàng)建該類的實(shí)例對象User user=(User)c1.newInstance();}

二、class類的動(dòng)態(tài)加載

Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動(dòng)態(tài)加載類。編譯時(shí)刻加載類是靜態(tài)加載、運(yùn)行時(shí)刻加載類是動(dòng)態(tài)加載類。

三、獲取方法信息

基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實(shí)例;可以通過getame();getSimpleName()獲取類的名稱。

Class c1=String.class;Class c2=int.class;Class c3=void.class;System.out.PRintln(c1.getName());System.out.println(c2.getSimpleName());

獲取類的所有方法,并打印出來:

public static void printClassInfo(Object object){        Class c=object.getClass();        System.out.println("類的名稱:"+c.getName());        /**         * 一個(gè)成員方法就是一個(gè)method對象         * getMethod()所有的 public方法,包括父類繼承的 public         * getDeclaredMethods()獲取該類所有的方法,包括private ,但不包括繼承的方法。         */        Method[] methods=c.getMethods();//獲取方法        //獲取所以的方法,包括private ,c.getDeclaredMethods();        for(int i=0;i<methods.length;i++){            //得到方法的返回類型            Class returnType=methods[i].getReturnType();            System.out.print(returnType.getName());            //得到方法名:            System.out.print(methods[i].getName()+"(");            Class[] parameterTypes=methods[i].getParameterTypes();            for(Class class1:parameterTypes){                System.out.print(class1.getName()+",");            }            System.out.println(")");        }    }
public class ReflectTest {        public static void main(String[] args){                String s="ss";                ClassUtil.printClassInfo(s);        }}

運(yùn)行:

類的名稱:java.lang.String

booleanequals(java.lang.Object,)

java.lang.StringtoString()

inthashCode()

四、獲取成員變量的信息

也可以獲取類的成員變量信息

 public static void printFiledInfo(Object o){        Class c=o.getClass();        /**         * getFileds()獲取public         * getDeclaredFields()獲取所有         */        Field[] fileds=c.getDeclaredFields();        for(Field f:fileds){            //獲取成員變量的類型            Class filedType=f.getType();            System.out.println(filedType.getName()+" "+f.getName());        }    }
public static void main(String[] args){                String s="ss";                //ClassUtil.printClassInfo(s);                ClassUtil.printFiledInfo(s);        }

運(yùn)行:

[C valueint hashlong serialVersionUID[Ljava.io.ObjectStreamField; serialPersistentFieldsjava.util.Comparator CASE_INSENSITIVE_ORDERint HASHING_SEEDint hash32

五、獲取構(gòu)造函數(shù)的信息

public static void printConstructInfo(Object o){        Class c=o.getClass();        Constructor[] constructors=c.getDeclaredConstructors();        for (Constructor con:constructors){            System.out.print(con.getName()+”(“);            Class[] typeParas=con.getParameterTypes();            for (Class class1:typeParas){                System.out.print(class1.getName()+” ,”);            }            System.out.println(“)”);        }    }
 public static void main(String[] args){                String s="ss";                //ClassUtil.printClassInfo(s);                //ClassUtil.printFiledInfo(s);                ClassUtil.printConstructInfo(s);        }

運(yùn)行:

java.lang.String([B ,)java.lang.String([B ,int ,int ,)java.lang.String([B ,java.nio.charset.Charset ,)java.lang.String([B ,java.lang.String ,)java.lang.String([B ,int ,int ,java.nio.charset.Charset ,)java.lang.String(int ,int ,[C ,)java.lang.String([C ,boolean ,)java.lang.String(java.lang.StringBuilder ,)java.lang.String(java.lang.StringBuffer ,)

...

六、方法反射的操作

獲取一個(gè)方法:需要獲取方法的名稱和方法的參數(shù)才能決定一個(gè)方法。

方法的反射操作:

method.invoke(對象,參數(shù)列表);

舉個(gè)例子:

class A{    public void add(int a,int b){        System.out.print(a+b);    }    public void toUpper(String a){        System.out.print(a.toUpperCase());    }}
public static void main(String[] args) {        A a=new A();        Class c=a.getClass();        try {            Method method=c.getMethod("add",new Class[]{int.class,int.class});            //也可以 Method method=c.getMethod("add",int.class,int.class);            //方法的反射操作            method.invoke(a,10,10);        }catch (Exception e){            e.printStackTrace();        }    }

運(yùn)行:

20

本篇文章已經(jīng)講解了java反射的基本用法, 它可以在運(yùn)行時(shí)判斷任意一個(gè)對象所屬的類;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對象;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對象的方法;生成動(dòng)態(tài)代理。

學(xué)習(xí)Java的同學(xué)注意了!!! 學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 99爱视频在线观看 | 久久精品久 | 国产91丝袜在线播放 | 国产亚洲精品久久久久久大师 | 中国3xxxx| 国产精品免费一区二区三区四区 | 大片毛片| 老女人碰碰在线碰碰视频 | 蜜桃视频网站www | 蜜桃免费在线 | 亚州综合图片 | 国产精品入口夜色视频大尺度 | 亚洲国产精品久久久久婷婷老年 | 在线观看国产www | 青草伊人网 | 精品国产精品久久 | 大学生a级毛片免费视频 | 久草手机在线观看视频 | 懂色粉嫩av久婷啪 | 欧美福利视频一区二区 | 在线小视频国产 | 亚洲精品午夜在线 | 国产成年人在线观看 | 国产精品久久久久久久久久 | 亚洲小视频在线 | 欧美特一级片 | 国产成人自拍小视频 | 国产呦在线观看视频 | 日日做夜夜操 | 日本在线视频免费观看 | 精品亚洲免费 | 成人短视频在线播放 | 黄色美女网站免费看 | 狠狠色噜噜狠狠狠米奇9999 | 国产精品美女久久久久久不卡 | av不卡毛片 | 国产精品美女一区二区 | 久久欧美亚洲另类专区91大神 | 国产乱free国语对白 | 国产亚洲精品综合一区91 | 成年人网站视频免费 |