首頁 Java Java基礎 java中什麼是反射?

java中什麼是反射?

Nov 11, 2019 am 10:04 AM
java 反射

java中什麼是反射?

什麼是反射(Reflection )?

主要是指程式可以存取、偵測和修改它本身狀態或行為的一種能力。

什麼是Java反射?

Java反射指的是在Java程式運行狀態中,對於任何一個類,都可以獲得這個類別的所有屬性和方法;對於給定的一個對象,都能夠調用它的任意一個屬性和方法。這種動態取得類別的內容以及動態呼叫物件的方法稱為反射機制。

Java反射機制主要提供了以下功能:

* 1.在執行時判斷任意一個物件所屬的類別。

* 2.執行時建構任意一個類別的物件。

* 3.在執行時判斷任意一個類別所具有的成員變數和方法。

* 4.執行時呼叫任意一個物件的方法。 

Java的反射機制主要是用來分析類別能力,我們可以在執行時間獲得程式或程式集中每個類型的成員和成員的資訊。在程式中一般的物件類型在編譯期就確認下來了,Java的反射機制可以在運行期動態建立對象,並呼叫其屬性。所以反射的核心是在運行期才動態載入類別或呼叫方法存取屬性,它不需要在事先知道運行物件是誰。

反射可以用來:

運行期建構任意一個類別的物件運行期判斷任意一個物件的所屬類別/是否是某個類別的實例運行期取得任意一個類別具有的屬性和方法,包括繼承的公有方法運行期呼叫任意一個物件的方法。

範例:

a) 取得方法

程式DumpMethods類別示範了Reflection API的基本作用,它讀取命令列參數指定的類別名,然後列印這個類別所具有的方法資訊。 

import java.lang.reflect.Method;
 
public class DumpMethods
{
    public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了
    {
        //获得字符串所标识的类的class对象
        Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
 
        //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
        Method[] methods = classType.getDeclaredMethods();
 
        //遍历输出所有方法声明
        for(Method method : methods)
        {
            System.out.println(method);
        }
    }
 
}

b) 透過反射呼叫方法 

import java.lang.reflect.Method;
 
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
 
    }
 
    public String echo(String message)
    {
        return "Hello: " + message;
    }
 
    public static void main(String[] args) throws Exception
    {
 
        // 以前的常规执行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");
 
        // 通过反射的方式
 
        // 第一步,获取Class对象
        // 前面用的方法是:Class.forName()方法获取
        // 这里用第二种方法,类名.class
        Class<?> classType = InvokeTester.class;
 
        // 生成新的对象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 输出true
 
        // 通过反射调用方法
        // 首先需要获得与该方法对应的Method对象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,
                int.class });
        // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组
 
        // 调用目标方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此时result是Integer类型
 
        //调用第二个方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
 
    }
}

以上是java中什麼是反射?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Laravel Lazy Loading與急切的加載 Laravel Lazy Loading與急切的加載 Jul 28, 2025 am 04:23 AM

懶加載在訪問關聯時才查詢,易導致N 1問題,適合不確定是否需要關聯數據的場景;2.急加載使用with()提前加載關聯數據,避免N 1查詢,適合批量處理場景;3.應優先使用急加載優化性能,可通過LaravelDebugbar等工具檢測N 1問題,並謹慎使用模型的$with屬性以避免不必要的性能開銷。

Python內存管理示例 Python內存管理示例 Jul 28, 2025 am 01:10 AM

Python的內存管理基於引用計數和垃圾回收機制,1.引用計數機制確保對像在引用數為0時立即釋放,sys.getrefcount()返回值比實際引用多1因其自身增加引用;2.循環引用無法通過引用計數清理,需依賴gc模塊的分代回收,調用gc.collect()可回收不可達對象;3.實際開發中應避免長期持有大對象引用,可使用weakref弱引用、及時置None釋放內存,並利用tracemalloc監控內存分配;4.總結:Python結合引用計數與垃圾回收管理內存,開發者可通過合理使用工具和優化引用管

將PHP與機器學習模型集成 將PHP與機器學習模型集成 Jul 28, 2025 am 04:37 AM

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorfastapiandcallingitfromphpusingcurlorguzzle.2.runpythonscriptsdirectsdirectlyectlyectlyfromphpsingexec()orshell_exec()orshell_exec()orshell_exec()

Laravel Raw SQL查詢示例 Laravel Raw SQL查詢示例 Jul 29, 2025 am 02:59 AM

Laravel支持使用原生SQL查詢,但應優先使用參數綁定以確保安全;1.使用DB::select()執行帶參數綁定的SELECT查詢,防止SQL注入;2.使用DB::update()執行UPDATE操作並返回影響行數;3.使用DB::insert()插入數據;4.使用DB::delete()刪除數據;5.使用DB::statement()執行如CREATE、ALTER等無結果集的SQL語句;6.推薦在QueryBuilder中使用whereRaw、selectRaw等方法結合原生表達式以提升安

python三元操作員示例 python三元操作員示例 Jul 28, 2025 am 02:57 AM

Python的三元運算符用於簡潔地實現if-else判斷,其語法為“value_if_trueifconditionelsevalue_if_false”;1.可用於簡單賦值,如根據數值正負返回對應字符串;2.可避免除零錯誤,如判斷分母非零再進行除法;3.可在字符串格式化中根據條件選擇內容;4.可在列表推導式中為不同元素分配標籤;需注意該運算符僅適用於二分支情況,不宜多層嵌套,複雜邏輯應使用傳統if-elif-else結構以保證可讀性。

帶有項目反應堆和彈簧WebFlux的Java的反應性編程 帶有項目反應堆和彈簧WebFlux的Java的反應性編程 Jul 29, 2025 am 12:04 AM

響應式編程在Java中通過ProjectReactor和SpringWebFlux實現高並發、低延遲的非阻塞服務。 1.ProjectReactor提供Mono和Flux兩個核心類型,支持聲明式處理異步數據流,並通過操作符鏈進行轉換、過濾等操作;2.SpringWebFlux基於Reactor構建,支持註解式和函數式兩種編程模型,運行在Netty等非阻塞服務器上,可高效處理大量並發連接;3.使用WebFlux Reactor能提升I/O密集型場景下的並發能力與資源利用率,天然支持SSE、WebSo

記事本查找並替換為正則捕獲組 記事本查找並替換為正則捕獲組 Jul 28, 2025 am 02:17 AM

在Notepad 中使用正則表達式捕獲組可有效重組文本,首先需打開替換對話框(Ctrl H),選擇“搜索模式”為“正則表達式”,1.使用()定義捕獲組,如(\w )捕獲單詞;2.在替換框中用\1、\2引用對應組;3.示例:交換姓名“JohnDoe”為“Doe,John”,查找(\w )\s (\w ),替換為\2,\1;4.日期格式轉換2023-12-25為25/12/2023,查找(\d{4})-(\d{2})-(\d{2}),替換為\3/\2/\1;5.日誌重排可提取時間、級別、ID等信息

在Java中使用Mapstruct進行無痛豆地圖 在Java中使用Mapstruct進行無痛豆地圖 Jul 28, 2025 am 03:20 AM

MapStruct是一個編譯時代碼生成器,用於簡化JavaBean之間的映射。 1.它通過定義接口自動生成實現類,避免手動編寫冗長的set/get映射代碼;2.具備類型安全、無運行時開銷、支持自動映射同名字段、自定義表達式、嵌套對象和集合映射等特性;3.可與Spring集成,使用@Mapper(componentModel="spring")將mapper注入為Springbean;4.配置簡單,只需引入mapstruct依賴和annotationProcessorPaths插

See all articles