日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java基础--反射

發(fā)布時(shí)間:2024/9/27 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础--反射 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?1.概念

什么是反射?

(1)Java反射機(jī)制的核心是在程序運(yùn)行時(shí)動(dòng)態(tài)加載類(lèi)并獲取類(lèi)的詳細(xì)信息,從而操作類(lèi)或?qū)ο蟮膶傩院头椒ā?本質(zhì)是JVM得到class對(duì)象之后,再通過(guò)class對(duì)象進(jìn)行反編譯,從而獲取對(duì)象的各種信息。

(2)Java屬于先編譯再運(yùn)行的語(yǔ)言,程序中對(duì)象的類(lèi)型在編譯期就確定下來(lái)了, 而當(dāng)程序在運(yùn)行時(shí)可能需要?jiǎng)討B(tài)加載某些類(lèi),這些類(lèi)因?yàn)橹坝貌坏?#xff0c; 所以沒(méi)有被加載到JVM。通過(guò)反射,可以在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建對(duì)象并調(diào)用其屬性, 不需要提前在編譯期知道運(yùn)行的對(duì)象是誰(shuí)。

Java核心技術(shù)卷I P190定義反射:能夠分析類(lèi)信息的能力的程序稱(chēng)為反射

類(lèi)信息:屬性(域)、方法、構(gòu)造器等

Class class1 = Class.forName("Performance"); System.out.println(class1); Field[] fields = class1.getFields();for (Field field : fields) {System.out.println(field);}

fields就是Performance對(duì)象的屬性/域

反射機(jī)制可以用來(lái):

  • 在運(yùn)行時(shí) ,分析類(lèi)的能力
  • 在運(yùn)行時(shí)查看對(duì)象,例如,編寫(xiě)一個(gè)toString方法供所有類(lèi)使用
  • 實(shí)現(xiàn)通用的數(shù)組操作代碼
  • 利用Method對(duì)象,這個(gè)對(duì)象很想像C++中的函數(shù)指針

反射的好處:

  • 在程序運(yùn)行過(guò)程中來(lái)操作這些對(duì)象;
  • 可以解耦,提高程序的可擴(kuò)展性。

2.獲取class對(duì)象的方式

?1.Class.forName("全類(lèi)名"):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回class對(duì)象(多用于配置文件,將類(lèi)名定義在配置文件當(dāng)中,讀取文件,加載類(lèi))

?2.類(lèi)名.class:通過(guò)類(lèi)名的class獲取 (多用于參數(shù)傳遞)????????

對(duì)象.getClass(): getClass()方法在object類(lèi)當(dāng)中定義著 (多用于對(duì)象獲取字節(jié)碼的方式)

3.對(duì)象.getClass():getClass()方法在object類(lèi)當(dāng)中定義著

getClass()方法定義在object類(lèi)里,多用于對(duì)象獲取字節(jié)碼的方式。

需要注意的是,同一類(lèi)加載器加載的文件(*.class)在一次程序運(yùn)行過(guò)程中,只會(huì)被加載一次,不論你通過(guò)哪種方式獲取的class對(duì)象都是同一個(gè)。

3. Class對(duì)象功能:

1.獲取成員變量

Field[] getFields() ;//獲取所有public修飾的成員變量

Field getField(String name);//獲取指定名稱(chēng)的

Field[] getDeclaredFilds();//獲取所有的成員變量,不考慮修飾符

Field getDeclaredField(String name);

2.獲取構(gòu)造方法

Constructor<?>[] getConstructors()

Constructor<T> getConstructor(類(lèi)<?>...parameterTypes)

Constructor<?>[] getDeclaredConstructors()

Constructor<T> getDeclaredConstructors(類(lèi)<?>...parameterTypes)

3.獲取方法名

Method[] getMethod()

Method getMethod(String name,類(lèi)<?>... parameterTypes)

Method[] getDeclaredMethod()

Method getDeclaredMethod(String name,類(lèi)<?>... parameterTypes)

?4.獲取類(lèi)名

String getName();

Field成員變量
1. ?void set(Object obj,Object value); ? //設(shè)置值

2. ? get(Object obj); ?//獲取值

3. ? setAccessible(true); ?//忽略安全訪問(wèn)修飾符的安全檢查 ? ?暴力反射 ==>private?

總結(jié)

以上是生活随笔為你收集整理的Java基础--反射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。