成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java的反射中一些重要的方法

eccozhou / 1559人閱讀

摘要:中有個(gè)類(lèi),是所有類(lèi)的繼承根源,其內(nèi)聲明了數(shù)個(gè)應(yīng)該在所有類(lèi)中被改寫(xiě)的方法等。其中返回一個(gè)對(duì)象。對(duì)象表示的類(lèi)或接口聲明的所有方法,包括公共保護(hù)默認(rèn)包訪(fǎng)問(wèn)和私有方法,但不包括繼承的方法。

原理

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ī)制。

Java中有個(gè)Object 類(lèi),是所有Java 類(lèi)的繼承根源,其內(nèi)聲明了數(shù)個(gè)應(yīng)該在所有Java 類(lèi)中被改寫(xiě)的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中g(shù)etClass()返回一個(gè)Class 對(duì)象。Class對(duì)象十分特殊。他是Java中所有類(lèi)的實(shí)例,借助它可以實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的操作。

實(shí)例 1. 準(zhǔn)備工作

創(chuàng)建Person類(lèi)

public class Person {
private String name;
private String age;
private void shot(){
    System.out.println("!!!");
}
protected void shot1() {
    System.out.println("111");
}
public String getAge() {
    return age;
}
public String getName() {
    return name;
}
public void setAge(String age) {
    this.age = age;
}
public void setName(String name) {
    this.name = name;
}
}

2. 創(chuàng)建Class對(duì)象

通過(guò)getClass()

Person person = new Person();
Class class2 = person.getClass();

通過(guò)Class.forName()

Class class1 = Class.forName("test0118.testR.Person");

.class

Class class3 = Person.class;

3. 對(duì)對(duì)象屬性進(jìn)行操作

獲取類(lèi)的屬性

getFields()只能訪(fǎng)問(wèn)類(lèi)中聲明為公有的字段,私有的字段它無(wú)法訪(fǎng)問(wèn),能訪(fǎng)問(wèn)從其它類(lèi)繼承來(lái)的公有方法.

getDeclaredFields()能訪(fǎng)問(wèn)類(lèi)中所有的字段,與public,private,protect無(wú)關(guān),不能訪(fǎng)問(wèn)從其它類(lèi)繼承來(lái)的方法

Field[] fields = class1.getDeclaredFields();
Field[] fields2 = class1.getFields();
for (Field field : fields) {
    System.out.println(Modifier.toString(field.getModifiers()) + field.getName());
}
for(Field field:fields2){
    System.out.println(Modifier.toString(field.getModifiers())+field.getName());//由于Person類(lèi)中并沒(méi)有公有字段,所以該循環(huán)不輸出任何值
}
/**
輸出:  
privatename
privateage
*/

獲取類(lèi)屬性的修飾符
上述代碼中有一個(gè)方法Modifier.toString(field.getModifiers())即是獲取該屬性的修飾符,field.getModifiers()返回一個(gè)int值,將該值轉(zhuǎn)化為對(duì)應(yīng)的描述要用到Modifier.toString()方法。

對(duì)類(lèi)的屬性進(jìn)行操作

Field field = class1.getField("name");
Object object = class1.newInstance();
field.setAccessible(true);//打破了封裝的特性,允許對(duì)私有屬性直接進(jìn)行操作
field.set(object, "123");
System.out.println(field.get(object));

獲取類(lèi)的方法

getMethods()返回某個(gè)類(lèi)的所有公用(public)方法包括其繼承類(lèi)的公用方法,當(dāng)然也包括它所實(shí)現(xiàn)接口的方法。

getDeclaredMethods()對(duì)象表示的類(lèi)或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪(fǎng)問(wèn)和私有方法,但不包括繼承的方法。當(dāng)然也包括它所實(shí)現(xiàn)接口的方法。

Method[] methods = class1.getDeclaredMethods();
Method[] methods2 = class1.getMethods();

獲取方法的參數(shù)和返回值的類(lèi)型

method.getParameterTypes():獲取方法參數(shù)類(lèi)型,返回Class數(shù)組

method.getReturnType():獲取方法返回值類(lèi)型,返回Class對(duì)象

Class[] ty = method.getParameterTypes();
Class rty = method.getReturnType();

使用反射調(diào)用方法

method.invoke(對(duì)象,參數(shù)...)

Object object = class1.newInstance();
Method method = class1.getMethod("setName", Class.forName("java.lang.String"));
method.invoke(object, "123123");
Method method2 = class1.getMethod("getName");
System.out.println((String) method2.invoke(object));
System.out.println(method.getReturnType());

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65393.html

相關(guān)文章

  • 最最最常見(jiàn)Java面試題總結(jié)——第二周

    摘要:與都繼承自類(lèi),在中也是使用字符數(shù)組保存字符串,,這兩種對(duì)象都是可變的。采用字節(jié)碼的好處語(yǔ)言通過(guò)字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題,同時(shí)又保留了解釋型語(yǔ)言可移植的特點(diǎn)。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...

    yearsj 評(píng)論0 收藏0
  • Java 注解實(shí)戰(zhàn)

    摘要:注解是的一個(gè)新特性。很重要,生產(chǎn)中我們開(kāi)發(fā)常用此值表示注解是否可被子元素繼承。類(lèi)注解方法注解通過(guò)反射獲取方法對(duì)象此部分內(nèi)容可參考通過(guò)反射獲取注解信息注解處理器實(shí)戰(zhàn)接下來(lái)我通過(guò)在公司中的一個(gè)實(shí)戰(zhàn)改編來(lái)演示一下注解處理器的真實(shí)使用場(chǎng)景。 前言:Java 注解,對(duì)于很多人都不陌生了,但是在公司的實(shí)際開(kāi)發(fā)中,可能讓我們自己去定義注解并應(yīng)用到生產(chǎn)環(huán)境中的機(jī)會(huì)比較少,所以會(huì)導(dǎo)致一部分人對(duì)注解的理解...

    Jochen 評(píng)論0 收藏0
  • 后端經(jīng)驗(yàn)

    摘要:在結(jié)構(gòu)上引入了頭結(jié)點(diǎn)和尾節(jié)點(diǎn),他們分別指向隊(duì)列的頭和尾,嘗試獲取鎖入隊(duì)服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。隨著編程經(jīng)驗(yàn)的日積月累,越來(lái)越感覺(jué)到了解虛擬機(jī)相關(guān)要領(lǐng)的重要性。 JVM 源碼分析之 Jstat 工具原理完全解讀 http://click.aliyun.com/m/8315/ JVM 源碼分析之 Jstat 工具原理完全解讀 http:...

    i_garfileo 評(píng)論0 收藏0
  • Java面試通關(guān)要點(diǎn)匯總集(基礎(chǔ)篇之基本功,非原作者)

    摘要:面試通關(guān)要點(diǎn)匯總集部分解答說(shuō)明如果你有幸能看到的話(huà),本文整體框架來(lái)自阿里梁桂釗的博文,總結(jié)的非常不錯(cuò)。這樣做的目的是對(duì)內(nèi)部數(shù)據(jù)進(jìn)行了不同級(jí)別的保護(hù),防止錯(cuò)誤的使用了對(duì)象的私有部分。被繼承的類(lèi)稱(chēng)為基類(lèi)和父類(lèi)或超類(lèi)。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面試通關(guān)要點(diǎn)匯...

    smallStone 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線(xiàn)程核心線(xiàn)程非核心線(xiàn)程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線(xiàn)程池工作原則當(dāng)線(xiàn)程池中線(xiàn)程數(shù)量小于則創(chuàng)建線(xiàn)程,并處理請(qǐng)求。當(dāng)線(xiàn)程池中的數(shù)量等于最大線(xiàn)程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線(xiàn)程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<