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

Java反射和動態(tài)代理

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

反射

反射允許對封裝類的成員變量、成員方法和構(gòu)造方法的信息進行編程訪問

成員變量:修飾符、名字、類型、get/set值

構(gòu)造方法:修飾符、名字、形參、創(chuàng)建對象

成員方法:修飾符、名字、形參、返回值、拋出的異常、獲取注解、運行方法

獲取class對象

  1. Class.forName(“全類名”);全類名是包名加類名
  2. 類名.class
  3. 對象.getClass();

在源代碼階段可以使用第一種方法(最常用)

在加載階段可以使用第二種方法(當參數(shù)傳遞)

在運行階段可以使用第三種方法(當已經(jīng)有了這個類的對象的時候才可以調(diào)用)

構(gòu)造方法的對象—Constructor

變量(字段)的對象—Field

成員方法—Method

Java反射和動態(tài)代理

        Class consumer = Class.forName("Consumer");
        Constructor[] constructors = consumer.getConstructors();
        for (int i = 0; i < constructors.length; i++)
            System.out.println(constructors[i]);
        Constructor[] declaredConstructors = consumer.getDeclaredConstructors();

        Constructor constructor = consumer.getConstructor();

        Constructor declaredConstructor = consumer.getDeclaredConstructor();

//        consumer.getConstructor(對應(yīng)構(gòu)造函數(shù)的參數(shù)列表);比如說String可以使用String.class
//        consumer.getDeclaredConstructor(對應(yīng)構(gòu)造函數(shù)的參數(shù)列表);比如說int,可以使用int.class
        Class consumer = Class.forName("Consumer");

        Constructor constructor = consumer.getConstructor(String.class);

        System.out.println(constructor.getModifiers());//獲取對應(yīng)構(gòu)造函數(shù)的權(quán)限修飾符

上面的方法可以獲取對應(yīng)構(gòu)造方法的權(quán)限修飾符。但是其是以整數(shù)的形式表示出來的:

1024:Abstract

16:Final

512:Interface

256:native

2:private

4:protected

1:public

8:static

2048:strict

32:synchronized

128:transient

64:volatile

        Class consumer = Class.forName("Consumer");

        Constructor constructor = consumer.getConstructor(String.class);

        System.out.println(constructor.getParameterCount());//獲取所需的參數(shù)個數(shù)

        Parameter[] parameters = constructor.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }//獲取所需的參數(shù)類型
        Class consumer = Class.forName("Consumer");

        Constructor declaredConstructor = consumer.getDeclaredConstructor(String.class);//獲取私有構(gòu)造方法
        declaredConstructor.setAccessible(true);//臨時取消私有的權(quán)限修飾
        declaredConstructor.newInstance("張三");//使用私有構(gòu)造方法創(chuàng)建對象實例

獲取成員變量

Class類中的用于獲取成員變量的方法

方法 作用
Field[] getFields() 返回所有公共的成員變量對象的數(shù)組
Field[] getDeclaredFields() 返回所有成員變量對象的數(shù)組
Field getField(String name) 返回單個公共成員變量的對象
Field getDeclaredField(String name) 返回單個成員變量的對象

Field類中用于創(chuàng)建對象的方法

方法 作用
void set(Object o,Object value) 賦值
Object get(Object obj) 獲取值

也可以獲取權(quán)限修飾符,還可以獲取字段類型

也可以暫時修改權(quán)限修飾符,然后可以進行g(shù)et、set方法

獲取成員方法

Java反射和動態(tài)代理

getMethods獲取的方法包含父類中的方法

Declared不可以獲取父類的,但是可以獲取私有的

反射可以結(jié)合配置文件動態(tài)的創(chuàng)建對象調(diào)用方法。

動態(tài)代理

動態(tài)代理可以無侵入式的為方法增加功能

對象有什么方法想被代理,代理就一定要有對應(yīng)的方法

通常要被代理的方法都放在接口中,兩個類都實現(xiàn)這個接口

Java.lang.reflect.Proxy類:提供了為對象產(chǎn)生代理對象的方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

參數(shù)一:用于指定使用哪一個類加載器,去加載生成的代理類

參數(shù)二:指定接口,這些接口用于指定生成的代理有什么方法

參數(shù)三:用于指定生成的代理對象要干什么事情

下面是一個示例:

方法類:

public class BigStar implements modefier {
    String name;

    public BigStar() {
    }

    public BigStar(String name) {
        this.name = name;
    }

    @Override
    public String Sing(String songName) {
        System.out.println(this.name + "正在唱" + songName);
        return "謝謝大家\n";
    }

    @Override
    public String Dance(String danceName) {
        System.out.println(this.name + "正在唱" + danceName);
        return "謝謝大家\n";
    }


    /**
     * 獲取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 設(shè)置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "BigStar{name = " + name + "}";
    }
}

接口:(寫想要被代理的方法)

public interface modefier {

    public abstract String Sing(String name);

    public abstract String Dance(String name);
}

代理類:

其中要判斷執(zhí)行為方法附加的功能

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

public class proxyUtil {

    public static modefier CreatProxy(BigStar bs) {

        modefier o = (modefier) Proxy.newProxyInstance(proxyUtil.class.getClassLoader(),
                new Class[]{modefier.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if ("Sing".equals(method.getName())) {
                            System.out.println("唱歌先收錢");
                        } else if ("Dance".equals(method.getName())) {
                            System.out.println("跳舞也要收錢");
                        }
                        return method.invoke(bs, args);
                    }
                }
        );

        return o;
    }
}

測試類:文章來源地址http://www.zghlxwxcb.cn/news/detail-436174.html

        BigStar bs = new BigStar("cxk");
        modefier modefier = proxyUtil.CreatProxy(bs);
        System.out.println(modefier.Sing("只因你太美"));

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

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

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

相關(guān)文章

  • java語法(二)線程并發(fā)、Juit單元測試、反射機制、注解、動態(tài)代理、XML解析、JVM

    java語法(二)線程并發(fā)、Juit單元測試、反射機制、注解、動態(tài)代理、XML解析、JVM

    正則表達式驗證網(wǎng)站 1、 ? :表示前邊這個字符可以出現(xiàn)0次或者1次。例如下邊 /used? 既可以匹配 use 也可以匹配 used 。 2、 * :匹配0個或者多個字符, * 號代表前邊這個字符可以出現(xiàn)0次或者多次。例如 /ab*c 可以匹配 ac、abc、abbbbc 3、 + :與 * 號不同的是, + 需要前面這個字符

    2024年02月06日
    瀏覽(24)
  • 【Python】面向?qū)ο?- 封裝 ② ( 訪問私有成員 | 對象無法訪問私有變量 / 方法 | 類內(nèi)部訪問私有成員 )

    【Python】面向?qū)ο?- 封裝 ② ( 訪問私有成員 | 對象無法訪問私有變量 / 方法 | 類內(nèi)部訪問私有成員 )

    在下面的 Python 類 Student 中 , 定義了私有的成員變量 , 該私有成員變量 , 只能在類內(nèi)部進行訪問 , 類的外部無法進行訪問 ; 在 類外部 創(chuàng)建的 Student 實例對象 , 是無法訪問 __address 私有成員的 ; 使用 實例對象 訪問 類的私有成員 , 編譯時不會報錯 , 但是運行時會報錯 最后一行代

    2024年02月13日
    瀏覽(23)
  • Java成員變量(全局變量)和局部變量

    在Java中變量類型有 成員變量 、 局部變量 和 靜態(tài)變量(類變量、static變量) ,本篇文章主要介紹成員變量(全局變量)和局部變量的區(qū)別。 根據(jù)變量的作用范圍,將程序中的變量分為成員變量(全局變量)和局部變量。 一、成員變量(全局變量) 成員變量(全局變量):

    2024年02月04日
    瀏覽(35)
  • Java 成員變量與局部變量有什么區(qū)別?

    Java 成員變量與局部變量有什么區(qū)別?

    節(jié)選自JavaGuide(Github 標星 134k star!「Java學(xué)習(xí) + 面試指南」一份涵蓋大部分 Java 程序員所需要掌握的核心知識) 語法形式 :從語法形式上看,成員變量是屬于類的,而局部變量是在代碼塊或方法中定義的變量或是方法的參數(shù);成員變量可以被 public , private , static 等修飾符所修

    2024年02月05日
    瀏覽(26)
  • 【詳解】Java反射機制(打穿封裝)

    【詳解】Java反射機制(打穿封裝)

    目錄 定義: 用途: 反射基本信息: 反射相關(guān)的類(important): Class類(反射機制的起源 ) Class類中的相關(guān)方法: 常用獲得類相關(guān)的方法(重要) 常用獲得類中屬性相關(guān)的方法(重要) 獲得類中注解相關(guān)的方法(了解) 獲得類中構(gòu)造器相關(guān)的方法(重要) 獲得該類所有構(gòu)造

    2024年04月16日
    瀏覽(74)
  • java中this的內(nèi)存原理以及成員變量和局部變量

    java中this的內(nèi)存原理以及成員變量和局部變量

    區(qū)分局部變量和成員變量 eg: 代表所在方法調(diào)用者的地址值 代表所在方法調(diào)用者的地址值: 此時main方法里面的調(diào)用者是s,s記錄的地址值是001;this的本質(zhì)是方法調(diào)用者的地址值,所以this指向的地址值是001。 this的內(nèi)存原理: 解析: 等號的右邊name出發(fā)了就近原則,表示setN

    2024年02月04日
    瀏覽(19)
  • Spring封裝的動態(tài)代理

    Spring封裝的動態(tài)代理

    看proxyFactory.addAdvice主要干了什么? 看下繼承關(guān)系: ?將advisor加入advisors ? 看下如何生成代理對象 org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy? org.springframework.aop.framework.DefaultAopProxyFactory#hasNoUserSuppliedProxyInterfaces ?判斷是否有接口,沒有接口直接返回true ?如果是接口

    2023年04月09日
    瀏覽(15)
  • Java反射、代理機制

    官方解釋:反射允許對封裝類的字段、方法和構(gòu)造方法的信息進行編程訪問。 虛擬機加載類文件后,會在方法區(qū)生成一個類對象,包含了類的結(jié)構(gòu)信息,如字段、方法、構(gòu)造方法等。反射是一種能夠在程序運行時動態(tài)訪問、修改類對象中任意屬性的機制(包括private屬性)。

    2024年02月10日
    瀏覽(15)
  • 【Java基礎(chǔ)】深入理解反射、反射的應(yīng)用(工廠模式、代理模式)

    【Java基礎(chǔ)】深入理解反射、反射的應(yīng)用(工廠模式、代理模式)

    Java 反射機制是指在 運行時動態(tài)地獲取和操作類的信息、調(diào)用對象的方法和訪問對象的屬性的能力 。通過反射,可以在程序運行時分析和修改類的結(jié)構(gòu)、行為和狀態(tài)。 Java 反射機制提供了以下功能: 獲取類的信息:可以獲取類的名稱、修飾符、父類、實現(xiàn)的接口等。 創(chuàng)建對

    2024年02月09日
    瀏覽(23)
  • 帶你深入理解 Java成員變量,局部變量和靜態(tài)變量的創(chuàng)建和回收時機

    Java中的成員變量、局部變量和靜態(tài)變量具有不同的創(chuàng)建和回收時機。下面我將詳細介紹它們的特點和生命周期。 成員變量(實例變量): 成員變量是定義在類中的變量,每個類的實例都會擁有自己的成員變量。它們的生命周期與對象的創(chuàng)建和銷毀相對應(yīng)。 創(chuàng)建時機:成員變

    2024年02月07日
    瀏覽(43)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包