国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 世界的法外狂徒:反射

這篇具有很好參考價值的文章主要介紹了Java 世界的法外狂徒:反射。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

概述

反射(Reflection)機(jī)制是指在運(yùn)行時動態(tài)地獲取類的信息以及操作類的成員(字段、方法、構(gòu)造函數(shù)等)的能力。通過反射,我們可以在編譯時期未知具體類型的情況下,通過運(yùn)行時的動態(tài)查找和調(diào)用。 雖然 Java 是靜態(tài)的編譯型語言,但是反射特性的加入,提供一種直接操作對象外的另一種方式,讓 Java 具備的一些靈活性和動態(tài)性,我們可以通過本篇文章來詳細(xì)了解它

為什么需要反射 ?

Java 需要用到反射的主要原因包括以下幾點(diǎn):

  1. 運(yùn)行時動態(tài)加載,創(chuàng)建類:Java中的類是在編譯時加載的,但有時希望在運(yùn)行時根據(jù)某些條件來動態(tài)加載和創(chuàng)建所需要類。反射就提供這種能力,這樣的能力讓程序可以更加的靈活,動態(tài)
  2. 動態(tài)的方法調(diào)用:根據(jù)反射獲取的類和對象,動態(tài)調(diào)用類中的方法,這對于一些類增強(qiáng)框架(例如 Spring 的 AOP),還有安全框架(方法調(diào)用前進(jìn)行權(quán)限驗(yàn)證),還有在業(yè)務(wù)代碼中注入一些通用的業(yè)務(wù)邏輯(例如一些日志,等,動態(tài)調(diào)用的能力都非常有用
  3. 獲取類的信息:通過反射,可以獲取類的各種信息,如類名、父類、接口、字段、方法等。這使得我們可以在運(yùn)行時檢查類的屬性和方法,并根據(jù)需要進(jìn)行操作

一段示例代碼

以下是一個簡單的代碼示例,展示基本的反射操作:

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        // 假設(shè)在運(yùn)行時需要調(diào)用某個類的方法,但該類在編譯時未知
        String className = "com.example.MyClass";

        try {
            // 使用反射動態(tài)加載類
            Class<?> clazz = Class.forName(className);

            // 使用反射獲取指定方法
            Method method = clazz.getMethod("myMethod");

            // 使用反射創(chuàng)建對象
            Object obj = clazz.newInstance();

            // 使用反射調(diào)用方法
            method.invoke(obj);

        } catch (ClassNotFoundException e) {
            System.out.println("類未找到:" + className);
        } catch (NoSuchMethodException e) {
            System.out.println("方法未找到");
        } catch (IllegalAccessException | InstantiationException e) {
            System.out.println("無法實(shí)例化對象");
        } catch (Exception e) {
            System.out.println("其他異常:" + e.getMessage());
        }
    }
}

在這個示例中,我們假設(shè)在編譯時并不知道具體的類名和方法名,但在運(yùn)行時需要根據(jù)動態(tài)情況來加載類、創(chuàng)建對象并調(diào)用方法。使用反射機(jī)制,我們可以通過字符串形式傳遞類名,使用 Class.forName() 動態(tài)加載類。然后,通過 getMethod() 方法獲取指定的方法對象,使用 newInstance() 創(chuàng)建類的實(shí)例,最后通過 invoke() 方法調(diào)用方法。

使用場景

技術(shù)再好,如果無法落地,那么始終都是空中樓閣,在日常開發(fā)中,我們常??梢栽谝韵碌膱鼍爸锌吹椒瓷涞膽?yīng)用:

  1. 框架和庫:許多框架和庫使用反射來實(shí)現(xiàn)插件化架構(gòu)或擴(kuò)展機(jī)制。例如,Java 的 Spring 框架使用反射來實(shí)現(xiàn)依賴注入(Dependency Injection)和 AOP(Aspect-Oriented Programming)等功能。
  2. ORM(對象關(guān)系映射):ORM 框架用于將對象模型和關(guān)系數(shù)據(jù)庫之間進(jìn)行映射。通過反射,ORM 框架可以在運(yùn)行時動態(tài)地讀取對象的屬性和注解信息,從而生成相應(yīng)的 SQL 語句并執(zhí)行數(shù)據(jù)庫操作。
  3. 動態(tài)代理:動態(tài)代理是一種常見的設(shè)計模式,通過反射可以實(shí)現(xiàn)動態(tài)代理。動態(tài)代理允許在運(yùn)行時創(chuàng)建代理對象,并攔截對原始對象方法的調(diào)用。這在實(shí)現(xiàn)日志記錄、性能統(tǒng)計、事務(wù)管理等方面非常有用
  4. 反射調(diào)試工具:在開發(fā)和調(diào)試過程中,有時需要查看對象的結(jié)構(gòu)和屬性,或者動態(tài)調(diào)用對象的方法來進(jìn)行測試。反射提供了一種方便的方式來檢查和操作對象的內(nèi)部信息,例如使用getDeclaredFields()獲取對象的所有字段,或使用getMethod()獲取對象的方法
  5. 單元測試:在單元測試中,有時需要模擬或替換某些對象的行為,以便進(jìn)行有效的測試。通過反射,可以在運(yùn)行時創(chuàng)建對象的模擬實(shí)例,并在測試中替換原始對象,以便控制和驗(yàn)證測試的行為

Class 對象

Class 對象是反射的第一步,我們先從 Class 對象聊起,因?yàn)樵诜瓷渲?,只要你想在運(yùn)行時使用類型信息,就必須先得到那個 Class 對象的引用,他是反射的核心,它代表了Java類的元數(shù)據(jù)信息,包含了類的結(jié)構(gòu)、屬性、方法和其他相關(guān)信息。通過Class對象,我們可以獲取和操作類的成員,實(shí)現(xiàn)動態(tài)加載和操作類的能力。

常見的獲取 Class 對象的方式幾種:

// 使用類名獲取
Class<?> clazz = Class.forName("com.example.MyClass");

// 使用類字面常量獲取
Class<?> clazz = MyClass.class;

// 使用對象的 getClass() 方法獲取
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();

需要注意的是,如果 Class.forName() 找不到要加載的類,它就會拋出異常 ClassNotFoundException

正如上面所說,獲取 Class 對象是第一步,一旦獲取了Class對象,我們可以使用它來執(zhí)行各種反射操作,例如獲取類的屬性、方法、構(gòu)造函數(shù)等。示例:

String className = clazz.getName(); // 獲取類的全限定名
int modifiers = clazz.getModifiers(); // 獲取類的修飾符,如 public、abstract 等
Class<?> superClass = clazz.getSuperclass(); // 獲取類的直接父類
Class<?> superClass = clazz.getSuperclass(); // 獲取類的直接父類
Class<?>[] interfaces = clazz.getInterfaces(); // 獲取類實(shí)現(xiàn)的接口數(shù)組
Constructor<?>[] constructors = clazz.getConstructors(); // 獲取類的公共構(gòu)造函數(shù)數(shù)組
Method[] methods = clazz.getMethods(); // 獲取類的公共方法數(shù)組
Field[] fields = clazz.getFields(); // 獲取類的公共字段數(shù)組
Object obj = clazz.newInstance(); // 創(chuàng)建類的實(shí)例,相當(dāng)于調(diào)用無參構(gòu)造函數(shù)

上述示例僅展示了Class對象的一小部分使用方法,還有許多其他方法可用于獲取和操作類的各個方面。通過Class對象,我們可以在運(yùn)行時動態(tài)地獲取和操作類的信息,實(shí)現(xiàn)反射的強(qiáng)大功能。

類型檢查

在反射的代碼中,經(jīng)常會對類型進(jìn)行檢查和判斷,從而對進(jìn)行對應(yīng)的邏輯操作,下面介紹幾種 Java 中對類型檢查的方法

instanceof 關(guān)鍵字

instanceof 是 Java 中的一個運(yùn)算符,用于判斷一個對象是否屬于某個特定類或其子類的實(shí)例。它返回一個布爾值,如果對象是指定類的實(shí)例或其子類的實(shí)例,則返回true,否則返回false。下面來看看它的使用示例

1:避免類型轉(zhuǎn)換錯誤

在進(jìn)行強(qiáng)制類型轉(zhuǎn)換之前,使用 instanceof 可以檢查對象的實(shí)際類型,以避免類型轉(zhuǎn)換錯誤或 ClassCastException 異常的發(fā)生:

if (obj instanceof MyClass) {
    MyClass myObj = (MyClass) obj;
    // 執(zhí)行針對 MyClass 類型的操作
}

2:多態(tài)性判斷

使用 instanceof 可以判斷對象的具體類型,以便根據(jù)不同類型執(zhí)行不同的邏輯。例如:

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();
} else if (animal instanceof Cat) {
    Cat cat = (Cat) animal;
    cat.meow();
}

3:接口實(shí)現(xiàn)判斷

在使用接口時,可以使用 instanceof 判斷對象是否實(shí)現(xiàn)了某個接口,以便根據(jù)接口進(jìn)行不同的處理

if (obj instanceof MyInterface) {
    MyInterface myObj = (MyInterface) obj;
    myObj.doSomething();
}

4:繼承關(guān)系判斷

instanceof 可以用于判斷對象是否是某個類的子類的實(shí)例。這在處理繼承關(guān)系時非常有用,可以根據(jù)對象的具體類型執(zhí)行相應(yīng)的操作

if (obj instanceof MyBaseClass) {
    MyBaseClass myObj = (MyBaseClass) obj;
    // 執(zhí)行 MyBaseClass 類型的操作
}

instanceof 看似可以做很多事情,但是在使用時也有很多限制,例如:

  1. 無法和基本類型進(jìn)行匹配:instanceof 運(yùn)算符只能用于引用類型,無法用于原始類型
  2. 不能和 Class 對象類型匹配:只可以將它與命名類型進(jìn)行比較
  3. 無法判斷泛型類型參數(shù):由于Java的泛型在運(yùn)行時會進(jìn)行類型擦除,instanceof 無法直接判斷對象是否是某個泛型類型的實(shí)例

instanceof 看似方便,但過度使用它可能表明設(shè)計上的缺陷,可能違反了良好的面向?qū)ο笤瓌t。應(yīng)盡量使用多態(tài)性和接口來實(shí)現(xiàn)對象行為的差異,而不是過度依賴類型檢查。

isInstance() 函數(shù)

java.lang.Class 類也提供 isInstance() 類型檢查方法,用于判斷一個對象是否是指定類或其子類的實(shí)例。更適合在反射的場景下使用,代碼示例:

Class<?> clazz = MyClass.class;
boolean result = clazz.isInstance(obj);

如上所述,相比 instanceof 關(guān)鍵字,isInstance() 提供更靈活的類型檢查,它們的區(qū)別如下:

  1. isInstance() 方法的參數(shù)是一個對象,而 instanceof 關(guān)鍵字的操作數(shù)是一個引用類型。因此,使用 isInstance() 方法時,可以動態(tài)地確定對象的類型,而 instanceof 關(guān)鍵字需要在編譯時指定類型。
  2. isInstance()方法可以應(yīng)用于任何Class對象。它是一個通用的類型檢查方法。而instanceof關(guān)鍵字只能應(yīng)用于引用類型,用于檢查對象是否是某個類或其子類的實(shí)例。
  3. isInstance()方法是在運(yùn)行時進(jìn)行類型檢查,它的結(jié)果取決于實(shí)際對象的類型。而instanceof關(guān)鍵字在編譯時進(jìn)行類型檢查,結(jié)果取決于代碼中指定的類型。
  4. 由于Java的泛型在運(yùn)行時會進(jìn)行類型擦除,instanceof無法直接檢查泛型類型參數(shù)。而isInstance()方法可以使用通配符類型(<?>)進(jìn)行泛型類型參數(shù)的檢查。

總體而言,isInstance()方法是一個動態(tài)的、通用的類型檢查方法,可以在運(yùn)行時根據(jù)實(shí)際對象的類型來判斷對象是否屬于某個類或其子類的實(shí)例。與之相比,instanceof關(guān)鍵字是在編譯時進(jìn)行的類型檢查,用于檢查對象是否是指定類型或其子類的實(shí)例。它們在表達(dá)方式、使用范圍和檢查方式等方面有所差異。在具體的使用場景中,可以根據(jù)需要選擇合適的方式進(jìn)行類型檢查。

代理

代理模式

代理模式是一種結(jié)構(gòu)型設(shè)計模式,其目的是通過引入一個代理對象,控制對原始對象的訪問。代理對象充當(dāng)了原始對象的中間人,可以在不改變原始對象的情況下,對其進(jìn)行額外的控制和擴(kuò)展。這是一個簡單的代理模式示例:

// 定義抽象對象接口
interface Image {
    void display();
}

// 定義原始對象
class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk();
    }

    private void loadFromDisk() {
        System.out.println("Loading image:" + fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying image:" + fileName);
    }
}

// 定義代理對象
class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;

    public ImageProxy(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

public class ProxyPatternExample {
    public static void main(String[] args) {
        // 使用代理對象訪問實(shí)際對象
        Image image = new ImageProxy("test_10mb.jpg");
        // 第一次訪問,加載實(shí)際對象
        image.display();
        // 第二次訪問,直接使用已加載的實(shí)際對象
        image.display();
    }
}

輸出結(jié)果:

Loading image:test_10mb.jpg
Displaying image:test_10mb.jpg
Displaying image:test_10mb.jpg

在上述代碼中,我們定義了一個抽象對象接口 Image,并有兩個實(shí)現(xiàn)類:RealImage 代表實(shí)際的圖片對象,ImageProxy 代表圖片的代理對象。在代理對象中,通過控制實(shí)際對象的加載和訪問,實(shí)現(xiàn)了延遲加載和額外操作的功能??蛻舳舜a通過代理對象來訪問圖片,實(shí)現(xiàn)了對實(shí)際對象的間接訪問。

動態(tài)代理

Java的動態(tài)代理是一種在運(yùn)行時動態(tài)生成代理類和代理對象的機(jī)制,它可以在不事先定義代理類的情況下,根據(jù)接口或父類來動態(tài)創(chuàng)建代理對象。動態(tài)代理使用Java的反射機(jī)制來實(shí)現(xiàn),通過動態(tài)生成的代理類,可以在方法調(diào)用前后插入額外的邏輯。

以下是使用動態(tài)代理改寫上述代碼的示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定義抽象對象接口
interface Image {
    void display();
}

// 定義原始對象
class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }

    private void loadFromDisk() {
        System.out.println("Loading image: " + filename);
    }

    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

// 實(shí)現(xiàn) InvocationHandler 接口的代理處理類
class ImageProxyHandler implements InvocationHandler {

    private Object realObject;

    public ImageProxyHandler(Object realObject) {
        this.realObject = realObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        if (method.getName().equals("display")) {
            System.out.println("Proxy: before display");
            result = method.invoke(realObject, args);
            System.out.println("Proxy: after display");
        }
        return result;
    }
}

public class DynamicProxyExample {

    public static void main(String[] args) {
        // 創(chuàng)建原始對象
        Image realImage = new RealImage("image.jpg");
        // 創(chuàng)建動態(tài)代理對象
        Image proxyImage = (Image) Proxy.newProxyInstance(Image.class.getClassLoader(), new Class[]{Image.class}, new ImageProxyHandler(realImage));
        // 使用代理對象訪問實(shí)際對象
        proxyImage.display();
    }
}

在上述代碼中,我們使用 java.lang.reflect.Proxy 類創(chuàng)建動態(tài)代理對象。我們定義了一個 ImageProxyHandler 類,實(shí)現(xiàn)了 java.lang.reflect.InvocationHandler 接口,用于處理代理對象的方法調(diào)用。在 invoke() 方法中,我們可以在調(diào)用實(shí)際對象的方法之前和之后執(zhí)行一些額外的邏輯。

輸出結(jié)果:

Loading image: image.jpg
Proxy: before display
Displaying image: image.jpg
Proxy: after display

在客戶端代碼中,我們首先創(chuàng)建了實(shí)際對象 RealImage,然后通過 Proxy.newProxyInstance() 方法創(chuàng)建了動態(tài)代理對象 proxyImage,并指定了代理對象的處理類為 ImageProxyHandler。最后,我們使用代理對象來訪問實(shí)際對象的 display() 方法。

通過動態(tài)代理,我們可以更加靈活地對實(shí)際對象的方法進(jìn)行控制和擴(kuò)展,而無需顯式地創(chuàng)建代理類。動態(tài)代理在實(shí)際開發(fā)中常用于 AOP(面向切面編程)等場景,可以在方法調(diào)用前后添加額外的邏輯,如日志記錄、事務(wù)管理等。

違反訪問權(quán)限

在 Java 中,通過反射機(jī)制可以突破對私有成員的訪問限制。以下是一個示例代碼,展示了如何使用反射來訪問和修改私有字段:

import java.lang.reflect.Field;

class MyClass {
    private String privateField = "Private Field Value";
}

public class ReflectionExample {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        MyClass myObj = new MyClass();
        // 獲取私有字段對象
        Field privateField = MyClass.class.getDeclaredField("privateField");

        // 取消對私有字段的訪問限制
        privateField.setAccessible(true);

        // 獲取私有字段的值
        String fieldValue = (String) privateField.get(myObj);
        System.out.println("Original value of privateField: " + fieldValue);

        // 修改私有字段的值
        privateField.set(myObj, "New Field Value");

        // 再次獲取私有字段的值
        fieldValue = (String) privateField.get(myObj);
        System.out.println("Modified value of privateField: " + fieldValue);
    }
}

在上述代碼中,我們定義了一個 MyClass 類,其中包含一個私有字段 privateField。在 ReflectionExample 類的 main 方法中,我們使用反射獲取了 privateField 字段,并通過 setAccessible(true) 方法取消了對私有字段的訪問限制。然后,我們使用 get() 方法獲取私有字段的值并輸出,接著使用 set() 方法修改私有字段的值。最后,再次獲取私有字段的值并輸出,驗(yàn)證字段值的修改。

輸出結(jié)果:

Original value of privateField: Private Field Value
Modified value of privateField: New Field Value

除了字段,通過反射還可以實(shí)現(xiàn)以下違反訪問權(quán)限的操作:

  • 調(diào)用私有方法
  • 實(shí)例化非公開的構(gòu)造函數(shù)
  • 訪問和修改靜態(tài)字段和方法
  • 繞過訪問修飾符檢查

雖然反射機(jī)制可以突破私有成員的訪問限制,但應(yīng)該慎重使用。私有成員通常被設(shè)計為內(nèi)部實(shí)現(xiàn)細(xì)節(jié),并且具有一定的安全性和封裝性。過度依賴反射訪問私有成員可能會破壞代碼的可讀性、穩(wěn)定性和安全性。因此,在使用反射突破私有成員限制時,請確保了解代碼的設(shè)計意圖和潛在風(fēng)險,并謹(jǐn)慎操作。

總結(jié)

反射技術(shù)自 JDK 1.1 版本引入以來,一直被廣泛使用。它為開發(fā)人員提供了一種在運(yùn)行時動態(tài)獲取類的信息、調(diào)用類的方法、訪問和修改類的字段等能力。在過去的應(yīng)用開發(fā)中,反射常被用于框架、工具和庫的開發(fā),以及動態(tài)加載類、實(shí)現(xiàn)注解處理、實(shí)現(xiàn)代理模式等場景。反射技術(shù)為Java的靈活性、可擴(kuò)展性和動態(tài)性增添了強(qiáng)大的工具。

當(dāng)下,反射技術(shù)仍然發(fā)揮著重要的作用。它被廣泛應(yīng)用于諸多領(lǐng)域,如框架、ORM(對象關(guān)系映射)、AOP(面向切面編程)、依賴注入、單元測試等。反射技術(shù)為這些領(lǐng)域提供了靈活性和可擴(kuò)展性,使得開發(fā)人員能夠在運(yùn)行時動態(tài)地獲取和操作類的信息,以實(shí)現(xiàn)更加靈活和可定制的功能。同時,許多流行的開源框架和庫,如 Spring、Hibernate、JUnit 等,也廣泛使用了反射技術(shù)。

反射技術(shù)可能繼續(xù)發(fā)展和演進(jìn)。隨著 Java 平臺的不斷發(fā)展和語言特性的增強(qiáng),反射技術(shù)可能會在性能優(yōu)化,安全性,模塊化等方面進(jìn)一步完善和改進(jìn)反射的應(yīng)用。然而,需要注意的是,反射技術(shù)應(yīng)該謹(jǐn)慎使用。由于反射涉及動態(tài)生成代碼、繞過訪問限制等操作,如果使用不當(dāng),可能導(dǎo)致代碼的可讀性和性能下降,甚至引入安全漏洞。因此,開發(fā)人員在使用反射時應(yīng)該充分理解其工作原理和潛在的風(fēng)險,并且遵循最佳實(shí)踐。文章來源地址http://www.zghlxwxcb.cn/news/detail-453644.html

到了這里,關(guān)于Java 世界的法外狂徒:反射的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Reflection java反射源碼分析

    Java的反射(reflection)機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調(diào)用任意一個對象的屬性和方法。這種 動態(tài)獲取程序信息 以及 動態(tài)調(diào)用對象的功能 稱為Java語言的反射機(jī)制。反

    2024年02月02日
    瀏覽(19)
  • c#反射(Reflection)

    當(dāng)我們在C#中使用反射時,可以動態(tài)地獲取和操作程序集、類型和成員。下面是一個簡單的C#反射示例,展示了如何使用反射來調(diào)用一個類的方法: 在這個示例中,我們首先獲取了MyClass的類型,并使用Activator.CreateInstance創(chuàng)建了一個MyClass的實(shí)例。然后,我們使用GetMethod方法獲取

    2024年02月10日
    瀏覽(26)
  • .net反射(Reflection)

    .net反射(Reflection)

    .NET 反射(Reflection)是指在運(yùn)行時動態(tài)地檢查、訪問和修改程序集中的類型、成員和對象的能力。通過反射,你可以在運(yùn)行時獲取類型的信息、調(diào)用方法、訪問字段和屬性,以及創(chuàng)建對象實(shí)例,而無需在編譯時知道這些類型的具體信息。 換句話說,反射可以在類的內(nèi)部成員不

    2024年04月25日
    瀏覽(22)
  • 【.NET Core】反射(Reflection)詳解(三)

    反射提供了對已封裝的程序集、模型和類型的對象一種動態(tài)訪問方法。反射包含動態(tài)加載程序集的Assembly類、程序集中模塊訪問的Module類、對類信息Type類、構(gòu)造函數(shù)信息ConstructorInfo類、方法信息MethodInfo類、字段信息FieldInfo類、事件信息EventInfo類、屬性信息PropertyInfo類、參數(shù)信

    2024年02月03日
    瀏覽(54)
  • C#中的反射(Reflection)使用經(jīng)典案例

    C#中的反射(Reflection)使用經(jīng)典案例

    C#中的反射(Reflection)是.NET框架提供的一種強(qiáng)大的運(yùn)行時元編程機(jī)制,它允許程序在運(yùn)行時獲取類型信息、創(chuàng)建對象實(shí)例、調(diào)用方法、訪問字段和屬性等,而這些操作在編譯時可能是未知的。以下是幾個使用反射的典型場景: 1. 動態(tài)加載和調(diào)用類的方法 假設(shè)有一個庫包含多

    2024年02月02日
    瀏覽(17)
  • [Unity/URP學(xué)習(xí)]反射探針(Reflection Probe)

    [Unity/URP學(xué)習(xí)]反射探針(Reflection Probe)

    傳統(tǒng)上,游戲使用一種稱為_反射貼圖_的技術(shù)來模擬來自對象的反射,同時將處理開銷保持在可接受的水平。此技術(shù)假定場景中的所有反射對象都可以“看到”(因此會反射)完全相同的周圍環(huán)境。如果游戲的主角(比如閃亮的汽車)處于開放空間中,此技術(shù)將非常有效,但

    2023年04月09日
    瀏覽(29)
  • unity在使用Reflection Probe(反射探頭)bake(烘焙)時,無法反射出范圍內(nèi)的物體。

    unity在使用Reflection Probe(反射探頭)bake(烘焙)時,無法反射出范圍內(nèi)的物體。

    bake后發(fā)現(xiàn)反射探頭還是原來的樣子,解決辦法以下: 打開lighting設(shè)置,觀察最下面是否為圖中這樣 ? 如果是,則點(diǎn)擊旁邊的cancel即可解決問題。? ? ?

    2024年02月12日
    瀏覽(17)
  • Java筆記040-反射/反射機(jī)制、Class類

    Java筆記040-反射/反射機(jī)制、Class類

    目錄 反射(reflection) 一個需求引出反射 反射機(jī)制 Java反射機(jī)制原理圖 Java反射機(jī)制可以完成 反射相關(guān)的主要類 反射機(jī)制的優(yōu)點(diǎn)和缺點(diǎn) 反射調(diào)用優(yōu)化-關(guān)閉訪問檢查 Class類 基本介紹 代碼解釋部分 類加載方法 應(yīng)用實(shí)例:Class02.java 獲取Class類對象 代碼解釋部分 哪些類型有Class對象

    2024年02月09日
    瀏覽(20)
  • Java的反射機(jī)制

    Java 的反射機(jī)制允許在程序運(yùn)行期間,借助反射 API 獲取類的內(nèi)部信息,并能直接操作對象的內(nèi)部屬性及方法。 Java 反射機(jī)制提供的功能: 在運(yùn)行時,使用反射分析類的能力,獲取有關(guān)類的一切信息(類所在的包、類實(shí)現(xiàn)的接口、標(biāo)注的注解、類的數(shù)據(jù)域、類的構(gòu)造器、類的

    2024年02月02日
    瀏覽(22)
  • Java的反射機(jī)制(2)

    目錄 Class類基本介紹 Class類的常用方法 如何獲取class類對象 哪些類型有Class對象 Class類基本介紹 在Java語言中,每個對象都有一個運(yùn)行時類,即其所屬的類。而這個運(yùn)行時類在Java中是以Class類的實(shí)例形式存在的,該Class類實(shí)例就是所謂的Class對象。Class類表示一個類或接口的元

    2024年02月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包