欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java反射機制最詳解

 更新時間:2021年08月25日 10:09:34   作者:勇敢牛牛不怕困難@帥  
這篇文章主要介紹了Java 反射機制原理與用法,結(jié)合實例形式詳細分析了Java反射機制的相關(guān)概念、原理、基本使用方法及操作注意事項,需要的朋友可以參考下

java反射機制

在這里插入圖片描述

什么是反射?

在java開發(fā)中有一個非常重要的概念就是java反射機制,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力,通過反射可以調(diào)用私有方法和私有屬性,大部分框架也都是運用反射原理的。java通常是先有類再有對象,有對象就可以調(diào)用方法或者屬性,java中的反射其實是通過Class對象來調(diào)用類里面的方法。

反射的功能:

①在運行時判斷任意一個對象所屬的類;

②在運行時構(gòu)造任意一個類的對象;

③在運行時判斷任意一個類所具有的成員變量和方法;

④在運行時調(diào)用任意一個對象的方法;

⑤生成動態(tài)代理。

Java的反射機制它知道類的基本結(jié)構(gòu),這種對Java類結(jié)構(gòu)探知的能力,我們稱為Java類的“自審”。如eclipse中,一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供用戶進行選擇。這就是利用了Java反射的原理,是對我們創(chuàng)建對象的探知、自審。

反射常用類:

1.Class枚舉類

Class 類的實例表示正在運行的 Java 應(yīng)用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數(shù)組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關(guān)鍵字 void 也表示為 Class 對象。

Class 沒有公共構(gòu)造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的。

		Person p = new Person();
		//獲取class對象的方式1
		// 需要依賴
		Class clazz = p.getClass();
		// 方式2 在編譯之前就知道要操作的class的名稱是什么
		Class clacc = Person.class;
Class clazz = Class.forName("com.openlab.test.Person");
		Constructor[] con = clazz.getConstructors();
		Method[] methods = clazz.getDeclaredMethods();
		Field[] fields = clazz.getDeclaredFields();
		System.out.println(con.length);
		System.out.println(methods.length);
		System.out.println(fields.length);

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.Constructor構(gòu)造器

Constructor 提供關(guān)于類的單個構(gòu)造方法的信息以及對它的訪問權(quán)限。Constructor 允許在將實參與帶有基礎(chǔ)構(gòu)造方法的形參的 newInstance() 匹配時進行擴展轉(zhuǎn)換,但是如果發(fā)生收縮轉(zhuǎn)換,則拋出 IllegalArgumentException。

在這里插入圖片描述

3.Method方法類

Method 提供關(guān)于類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法可能是類方法或?qū)嵗椒ǎòǔ橄蠓椒ǎ?br />

Method 允許在匹配要調(diào)用的實參與基礎(chǔ)方法的形參時進行擴展轉(zhuǎn)換;但如果要進行收縮轉(zhuǎn)換,則會拋出 IllegalArgumentException。

在這里插入圖片描述

在這里插入圖片描述

4.Field變量類

Field 提供有關(guān)類或接口的單個字段的信息,以及對它的動態(tài)訪問權(quán)限。反射的字段可能是一個類(靜態(tài))字段或?qū)嵗侄巍?br /> Array 允許在執(zhí)行 get 或 set 訪問操作期間進行擴展轉(zhuǎn)換,但如果將發(fā)生收縮轉(zhuǎn)換,則拋出一個 IllegalArgumentException。

在這里插入圖片描述

在這里插入圖片描述

反射運行指示圖

在這里插入圖片描述

通常情況下我們只能在編寫源代碼時能夠清楚的了解到對象的相關(guān)屬性和方法,常常這些方法是被固定的,程序進入編譯之后變不能更改的,但是java加入了反射機制,便可以做到編譯之后還能對程序做出更改。

通過反射獲取對象

package com.openlab.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
	public static void main(String[] args) {
//		Person p = new Person();
//		//獲取class對象的方式1
//		// 需要依賴
//		Class clazz = p.getClass();
//		// 方式2 在編譯之前就知道要操作的class的名稱是什么
//		Class clacc = Person.class;
//		
//		Constructor[] con = clazz.getConstructors();
//		Method[] methods = clazz.getDeclaredMethods();
//		Field[] fields = clazz.getDeclaredFields();
//		
//		System.out.println(con.length);
//		System.out.println(methods.length);
//		System.out.println(fields.length);
		// 方式3 常用
		Class clazz;
		try {
			clazz = Class.forName("com.openlab.test.Person");
			Constructor con = clazz.getDeclaredConstructor(new Class[]{String.class,int.class});
			con.setAccessible(true);
			Person p = (Person) con.newInstance(new Object[]{"張三瘋",99});
			System.out.println(p);
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		Person p = (Person) clazz.newInstance();
	}
}

那么為什么要使用這種方式來創(chuàng)建對象呢,原因很簡單,使用反射來創(chuàng)建對象,最直接的原因就是因為,在寫底層代碼的時候,程序員對于要創(chuàng)建的對象有很多的不確定性,而正常的創(chuàng)建對象需要知道類名,而很多使用在使用反射的創(chuàng)建對象時,都是只給了個泛型,所以在不確定類型的情況下創(chuàng)建對象是反射獨有的功能。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 從Spring遷移到Spring Boot的方法步驟

    從Spring遷移到Spring Boot的方法步驟

    這篇文章主要介紹了從Spring遷移到Spring Boot的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java掃描文件夾下所有文件名

    Java掃描文件夾下所有文件名

    這篇文章主要為大家詳細介紹了Java掃描文件夾下所有文件名,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 解析Java虛擬機中類的初始化及加載器的父委托機制

    解析Java虛擬機中類的初始化及加載器的父委托機制

    這篇文章主要介紹了Java虛擬機中類的初始化及加載器的父委托機制,包括命名空間等深層次的知識點講解,需要的朋友可以參考下
    2015-11-11
  • springboot中使用redis由淺入深解析

    springboot中使用redis由淺入深解析

    這篇文章主要由淺入深為大家介紹了springboot中使用redis的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java如何將pdf轉(zhuǎn)換成image

    java如何將pdf轉(zhuǎn)換成image

    這篇文章主要為大家詳細介紹了java如何將pdf轉(zhuǎn)換成image,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • SpringBoot錯誤提示400狀態(tài)問題

    SpringBoot錯誤提示400狀態(tài)問題

    這篇文章主要介紹了SpringBoot錯誤提示400狀態(tài)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關(guān)于spring中單例Bean引用原型Bean產(chǎn)生的問題及解決

    關(guān)于spring中單例Bean引用原型Bean產(chǎn)生的問題及解決

    這篇文章主要介紹了關(guān)于spring中單例Bean引用原型Bean產(chǎn)生的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring Boot使用profile如何配置不同環(huán)境的配置文件

    Spring Boot使用profile如何配置不同環(huán)境的配置文件

    ,springboot支持通過不同的profile來配置不同環(huán)境的配置,下面就大致介紹一下yml配置文件跟properties配置文件怎么使用profile配置不同環(huán)境的配置文件
    2018-01-01
  • Java操作IO對象流進行數(shù)據(jù)的讀寫

    Java操作IO對象流進行數(shù)據(jù)的讀寫

    這篇文章主要介紹了Java操作IO對象流進行數(shù)據(jù)的讀寫,本文通過例子逐步介紹了java如何操作IO流,和文字解析,需要的朋友可以參考下
    2021-07-07
  • Java中臨時文件目錄的使用

    Java中臨時文件目錄的使用

    :Java提供了系統(tǒng)屬性java.io.tmpdir來獲取默認臨時文件目錄,適用于不同操作系統(tǒng),使用Files.createTempFile方法創(chuàng)建臨時文件,并在不需要時應(yīng)及時刪除,下面就來介紹一下
    2024-10-10

最新評論