最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中反射詳解

 更新時間:2017年02月17日 16:55:36   作者:風(fēng)一樣的碼農(nóng)  
本文主要介紹了Java中反射的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧

閱讀目錄

  1. Java反射API
  2. 通過反射創(chuàng)建實例對象
  3. 通過反射調(diào)用私有方法
  4. 關(guān)于javap工具
  5. 參考資料

Java反射API

Java反射指的是在運行狀態(tài)時,能夠獲取類的屬性和方法或者修改類運行時行為的過程。

java.lang.Class類提供了很多方法用于獲取元數(shù)據(jù)、檢查和改變類運行時的行為。

Java的反射主要涉及java.lang和java.lang.reflect包下的類。

反射應(yīng)用場景舉例

  1. IDE, 如Eclipse、MyEclipse、NetBeans等;
  2. 調(diào)試器;
  3. 測試工具等;
  4. 各大框架、spring、hibernate等;

java.lang.Class類

java.lang.Class主要提供了以下兩個功能:

  1. 提供方法用于訪問運行期間類的元數(shù)據(jù);
  2. 提供方法用于檢查和修改類的運行時行為;

java.lang.Class類常用方法

Method Description
1) public String getName() 返回類名
2) public static Class forName(String className)throws ClassNotFoundException 加載類并返回Class對象
3) public Object newInstance()throws InstantiationException,IllegalAccessException 創(chuàng)建實例對象
4) public boolean isInterface() 判斷是否是接口
5) public boolean isArray() 判斷是否是數(shù)組
6) public boolean isPrimitive() 判斷是否是原始數(shù)據(jù)類型
7) public Class getSuperclass() 返回父類Class引用
8) public Field[] getDeclaredFields()throws SecurityException 返回類的成員屬性字段數(shù)組
9) public Method[] getDeclaredMethods()throws SecurityException 返回類的方法數(shù)組
10) public Constructor[] getDeclaredConstructors()throws SecurityException 返回類的構(gòu)造方法數(shù)組
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException 返回類中指定參數(shù)類型的方法

怎樣獲取Class對象

有三種方式,如下:

  1. Class類的forName()方法,動態(tài)加載,運行時,開始裝入類, 并做類的靜態(tài)初始化
  2. 對象的getClass()方法,靜態(tài)加載(編譯時已加載)
  3. .class語法, 靜態(tài)加載(編譯時已加載)

forName()方法示例

可用于動態(tài)加載,當(dāng)你知道類的全限定名時,可以使用該方式。注意原始數(shù)據(jù)類型不適用該方法;

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[]) throws ClassNotFoundException
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

getClass()方法示例:

從實例對象中獲取Class對象

package tmp;
class Simple
{
}
public class Test
{
 void printName(Object obj)
 {
 }
 public static void main(String args[])
 {
 Simple s = new Simple();
 Class<? extends Object> c = s.getClass();
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

.class語法示例

作用于類名上,也可應(yīng)用于原始數(shù)據(jù)類型,如下所示:

package tmp;
public class Test
{
 public static void main(String args[])
 {
 Class<Boolean> c = boolean.class;
 System.out.println(c.getName());
 Class<Test> c2 = Test.class;
 System.out.println(c2.getName());
 }
}
boolean
tmp.Test

判斷Class對象對應(yīng)的類型

以下方法可用于判斷Class對象對應(yīng)的類型:

1) public boolean isInterface(): 是否對應(yīng)接口
2) public boolean isArray(): 是否對應(yīng)數(shù)組
3) public boolean isPrimitive(): 是否對應(yīng)原始數(shù)據(jù)類型

代碼示例:

package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.isInterface());
 Class<?> c2 = Class.forName("tmp.My");
 System.out.println(c2.isInterface());
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}
false
true

通過反射創(chuàng)建實例對象

有兩種方式,如下:

  1. 通過Class對象的newInstance()方法創(chuàng)建,這種方式只能調(diào)用無參構(gòu)造方法;
  2. 通過Constructor對象的newInstance()方法創(chuàng)建,這種方式適用于有參構(gòu)造方法,并且還可以破壞單例模式,調(diào)用私有構(gòu)造方法;

所以,通常來講,第二種方式比第一種使用范圍更廣。

Class對象調(diào)用newInstance()方法示例

package tmp;
class Simple
{
 void message()
 {
 System.out.println("Hello Java");
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Simple s = (Simple) c.newInstance();
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java

Constructor對象調(diào)用newInstance()方法示例

注意這里可以根據(jù)傳入?yún)?shù)的類型來得到指定的構(gòu)造方法,還可以改變構(gòu)造方法的訪問權(quán)限限制。

package tmp;
import java.lang.reflect.Constructor;
class Simple
{
 private String msg;
 void message()
 {
 System.out.println("Hello Java," + msg);
 }
 private Simple(String s){
 this.msg = s;
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Constructor<?> con = c.getDeclaredConstructor(String.class);
 con.setAccessible(true);
 Simple s = (Simple) con.newInstance("...");
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java,...

通過反射調(diào)用私有方法

通過反射,我們可以調(diào)用其它類的私有方法,主要涉及java.lang.Class和java.lang.reflect.Method類;

其中主要是用到了Method類的setAccessible方法和invoke方法,前者修改訪問權(quán)限,后者調(diào)用方法。

通過調(diào)用有參私有方法示例:

package tmp;
import java.lang.reflect.Method;
class A
{
 private void cube(int n)
 {
 System.out.println(n * n * n);
 }
}
class Test
{
 public static void main(String args[]) throws Exception
 {
 Class<A> c = A.class;
 Object obj = c.newInstance();
 Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
 m.setAccessible(true);
 m.invoke(obj, 4);
 }
}

關(guān)于javap工具

使用javap命令可以反匯編java的字節(jié)碼文件,展示class文件中的字段屬性、構(gòu)造方法、普通方法信息;

使用說明:

javap java.lang.Object示例

javap -c Test示例:

寫個簡單的Test類,如下:

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

輸入javap -c Test:

參考資料

基本屬于翻譯,做了小部分修改

http://www.javatpoint.com/java-reflection

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • java多態(tài)性中的Overload和Override區(qū)別詳解

    java多態(tài)性中的Overload和Override區(qū)別詳解

    這篇文章主要介紹了java多態(tài)性中的Overload和Override區(qū)別詳解,重寫(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn),而重載(Overloading)是一個類中多態(tài)性的一種表現(xiàn),需要的朋友可以參考下
    2023-07-07
  • java中Servlet程序下載文件實例詳解

    java中Servlet程序下載文件實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java中Servlet程序下載文件實例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • Flink結(jié)合Kafka實現(xiàn)通用流式數(shù)據(jù)處理

    Flink結(jié)合Kafka實現(xiàn)通用流式數(shù)據(jù)處理

    這篇文章將和大家一起深入探討Flink和Kafka的關(guān)系以及它們在數(shù)據(jù)流處理中的應(yīng)用,并提供一些最佳實踐和實際案例,希望對大家有一定的幫助
    2025-03-03
  • SpringBoot項目中的視圖解析器問題(兩種)

    SpringBoot項目中的視圖解析器問題(兩種)

    SpringBoot官網(wǎng)推薦使用HTML視圖解析器,但是根據(jù)個人的具體業(yè)務(wù)也有可能使用到JSP視圖解析器,所以本文介紹了兩種視圖解析器,感興趣的可以了解下
    2020-06-06
  • Java 高并發(fā)十: JDK8對并發(fā)的新支持詳解

    Java 高并發(fā)十: JDK8對并發(fā)的新支持詳解

    本文主要介紹Java 高并發(fā)JDK8的支持,這里整理了詳細(xì)的資料及1. LongAdder 2. CompletableFuture 3. StampedLock的介紹,有興趣的小伙伴可以參考下
    2016-09-09
  • 一文帶你掌握J(rèn)ava?LinkedBlockingQueue

    一文帶你掌握J(rèn)ava?LinkedBlockingQueue

    LinkedBlockingQueue?是一個可選有界阻塞隊列,這篇文章主要為大家詳細(xì)介紹了Java中LinkedBlockingQueue的實現(xiàn)原理與適用場景,感興趣的可以了解一下
    2023-04-04
  • SpringBoot工程下使用OpenFeign的坑及解決

    SpringBoot工程下使用OpenFeign的坑及解決

    這篇文章主要介紹了SpringBoot工程下使用OpenFeign的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中Steam流的用法詳解

    Java中Steam流的用法詳解

    Stream是Java?8?API添加的一個新的抽象,稱為流Stream,本文主要介紹了Java中Steam流的用法詳解,具有一定的參考價值,感興趣的可以了解一下
    2023-04-04
  • Spring定時任務(wù)中@PostConstruct被多次執(zhí)行異常的分析與解決

    Spring定時任務(wù)中@PostConstruct被多次執(zhí)行異常的分析與解決

    這篇文章主要給大家介紹了關(guān)于Spring定時任務(wù)中@PostConstruct被多次執(zhí)行異常的分析與解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 利用Java制作字符動畫實例代碼

    利用Java制作字符動畫實例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Java制作字符動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論

同心县| 扎囊县| 抚远县| 新乡县| 高州市| 乐平市| 中牟县| 浦东新区| 安乡县| 临邑县| 深州市| 定兴县| 盈江县| 石屏县| 仁寿县| 南通市| 上虞市| 秦皇岛市| 乌恰县| 宁阳县| 车险| 华池县| 招远市| 乡宁县| 黄石市| 乌恰县| 嘉定区| 丹棱县| 抚宁县| 新野县| 延长县| 榆社县| 株洲市| 阿克陶县| 岑巩县| 龙南县| 乐业县| 鸡泽县| 怀宁县| 监利县| 贡觉县|