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

【JAVA】單元測(cè)試、反射、注解、動(dòng)態(tài)代理

這篇具有很好參考價(jià)值的文章主要介紹了【JAVA】單元測(cè)試、反射、注解、動(dòng)態(tài)代理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1 單元測(cè)試

Junit常用注解(4.幾版本)

@Test

測(cè)試方法

@Before

用來(lái)修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之前執(zhí)行一次。

@After

用來(lái)修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之后執(zhí)行一次。

@BeforeClass

用來(lái)靜態(tài)修飾方法,該方法會(huì)在所有測(cè)試方法之前只執(zhí)行一次。

@AfterClass

用來(lái)靜態(tài)修飾方法,該方法會(huì)在所有測(cè)試方法之后只執(zhí)行一次。

Junit常用注解(5.幾版本)

@Test

測(cè)試方法

@BeforeEach

用來(lái)修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之前執(zhí)行一次。

@AfterEach

用來(lái)修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之后執(zhí)行一次。

@BeforeAll

用來(lái)靜態(tài)修飾方法,該方法會(huì)在所有測(cè)試方法之前只執(zhí)行一次。

@AfterAll

用來(lái)靜態(tài)修飾方法,該方法會(huì)在所有測(cè)試方法之后只執(zhí)行一次

2 反射

反射是在運(yùn)行時(shí)獲取類(lèi)的字節(jié)碼文件對(duì)象,然后可以解析類(lèi)中的全部成分

  • 反射的核心思想和關(guān)鍵:得到編譯之后的class文件對(duì)象
  • 在運(yùn)行時(shí),可以直接得到這個(gè)類(lèi)的構(gòu)造器對(duì)象Constructor,類(lèi)的成員變量對(duì)象Field,類(lèi)的成員方法對(duì)象Method

這種運(yùn)行時(shí)動(dòng)態(tài)獲取類(lèi)信息以及動(dòng)態(tài)調(diào)用類(lèi)中成分的能力稱(chēng)為Java語(yǔ)言的反射機(jī)制

反射的關(guān)鍵:

反射的第一步都是先獲取Class類(lèi)對(duì)象

// HelloWorld.java -> javac -> HelloWorld.class
// 方式一:類(lèi)名.class
Class c= HelloWorld.class;
// 方式二:Class.forName("全類(lèi)名")
Class c2 = Class.forName("包名.類(lèi)名");
// 方式三:對(duì)象.getClass();
HelloWorld h = new HelloWorld();
Class c3 = h.getClass();
// 獲取類(lèi)的全名,即包名.類(lèi)名
String name = Class.forName("包名.類(lèi)名").getName();
// 只獲取類(lèi)名
String name = Class.forName("包名.類(lèi)名").getSimpleName();

獲取類(lèi)對(duì)象后,我們可以類(lèi)對(duì)象中獲取類(lèi)的成分對(duì)象

獲取構(gòu)造器

方法 說(shuō)明

Constructor<?>[] getConstructors?()

返回所有構(gòu)造器對(duì)象的數(shù)組(只能拿public的)

Constructor<?>[] getDeclaredConstructors?()

返回所有構(gòu)造器對(duì)象的數(shù)組,存在就能拿到

Constructor<T> getConstructor?(Class<?>... parameterTypes)

返回單個(gè)構(gòu)造器對(duì)象(只能拿public的)

Constructor<T> getDeclaredConstructor?(Class<?>... parameterTypes)

返回單個(gè)構(gòu)造器對(duì)象,存在就能拿到

Constructor類(lèi)中用于創(chuàng)建對(duì)象的方法

T newInstance?(Object... initargs)

根據(jù)指定的構(gòu)造器創(chuàng)建對(duì)象

public void? setAccessible(boolean flag)

設(shè)置為true,表示取消訪(fǎng)問(wèn)檢查,進(jìn)行暴力反射

非public的構(gòu)造器,反射可以破壞其封裝性,私有也可以執(zhí)行

獲取成員變量

作用:在某個(gè)對(duì)象中取值、賦值

Field[] getFields?()

返回所有成員變量對(duì)象的數(shù)組(只能拿public的)

Field[] getDeclaredFields?()

返回所有成員變量對(duì)象的數(shù)組,存在就能拿到

Field getField?(String name)

返回單個(gè)成員變量對(duì)象(只能拿public的)

Field getDeclaredField?(String name)

返回單個(gè)成員變量對(duì)象,存在就能拿到

Field類(lèi)中用于取值、賦值的方法

void set?(Object obj, Object value)

賦值

Object get?(Object obj)

獲取值。

獲取方法對(duì)象

作用:在某個(gè)對(duì)象中進(jìn)行執(zhí)行此方法

Method[] getMethods?()

返回所有成員方法對(duì)象的數(shù)組(只能拿public的)

Method[] getDeclaredMethods?()

返回所有成員方法對(duì)象的數(shù)組,存在就能拿到

Method getMethod?(String name, Class<?>... parameterTypes)

返回單個(gè)成員方法對(duì)象(只能拿public的)

Method getDeclaredMethod?(String name, Class<?>... parameterTypes)

返回單個(gè)成員方法對(duì)象,存在就能拿到

Method類(lèi)中用于觸發(fā)執(zhí)行的方法

Object invoke?(Object obj, Object... args)

運(yùn)行方法

參數(shù)一:用obj對(duì)象調(diào)用該方法

參數(shù)二:調(diào)用方法的傳遞的參數(shù)(如果沒(méi)有就不寫(xiě))

返回值:方法的返回值(如果沒(méi)有就不寫(xiě))

反射的作用

繞過(guò)編譯階段為集合添加數(shù)據(jù)

反射是在運(yùn)行時(shí)的技術(shù),此時(shí)集合的泛型將不能產(chǎn)生約束了,此時(shí)可以為集合存入其它任意類(lèi)型的元素

ArrayList<Integer> lists = new ArrayList<>();
list.add(100);
// list.add(“ABC"); // 報(bào)錯(cuò)
list.add(99);
// 但是下面方法可以添加字符串
Class l = lists.getClass();
Method add = l.getDeclaredMethod("add", Object.class);
add.invoke(lists, "ABC");

反射的作用:

  • 可以在運(yùn)行時(shí)得到一個(gè)類(lèi)的全部成分
  • 可以破壞封裝性
  • 破壞泛型的約束性
  • 做Java高級(jí)框架

基本主流框架都會(huì)基于反射設(shè)計(jì)一些通用技術(shù)功能

3 注解

對(duì)Java中類(lèi)、方法、成員變量做標(biāo)記,然后進(jìn)行特殊處理,到底做何種處理由業(yè)務(wù)需求來(lái)決定

自定義注解

自定義注解就是自己做一個(gè)注解來(lái)使用

public @interface 注解名稱(chēng) {
    public 屬性類(lèi)型 屬性名() default 默認(rèn)值 ;
}

元注解

注解的注解,放在注解上的注解

@Target:約束自定義注解只能在哪些地方使用

@Retention:申明注解的生命周期

@Target可使用的值定義在ElementType枚舉類(lèi)中,常用值如下

  • TYPE,類(lèi),接口
  • FIELD, 成員變量
  • METHOD, 成員方法
  • PARAMETER, 方法參數(shù)
  • CONSTRUCTOR, 構(gòu)造器
  • LOCAL_VARIABLE, 局部變量

@Retention可使用的值定義在RetentionPolicy枚舉類(lèi)中,常用值如下

  • SOURCE: 注解只作用在源碼階段,生成的字節(jié)碼文件中不存在
  • CLASS:? 注解作用在源碼階段,字節(jié)碼文件階段,運(yùn)行階段不存在,默認(rèn)值.
  • RUNTIME:注解作用在源碼階段,字節(jié)碼文件階段,運(yùn)行階段(開(kāi)發(fā)常用)

注解解析

注解的操作中通常需要進(jìn)行解析,注解的解析就是判斷是否存在注解,存在注解就解析出內(nèi)容

  • Annotation:注解的頂級(jí)接口,注解都是Annotation類(lèi)型的對(duì)象
  • AnnotatedElement:該接口定義了與注解解析相關(guān)的解析方法

Annotation[]??? getDeclaredAnnotations()

獲得當(dāng)前對(duì)象上使用的所有注解,返回注解數(shù)組。

T getDeclaredAnnotation(Class<T> annotationClass)

根據(jù)注解類(lèi)型獲得對(duì)應(yīng)注解對(duì)象

boolean isAnnotationPresent(Class<Annotation> annotationClass)

判斷當(dāng)前對(duì)象是否使用了指定的注解,如果使用了則返回true,否則false

4 動(dòng)態(tài)代理

代理就是被代理者沒(méi)有能力或者不愿意去完成某件事情,需要找個(gè)人代替自己去完成這件事,動(dòng)態(tài)代理就是用來(lái)對(duì)業(yè)務(wù)功能(方法)進(jìn)行代理

關(guān)鍵步驟

必須有接口,實(shí)現(xiàn)類(lèi)要實(shí)現(xiàn)接口(代理通常是基于接口實(shí)現(xiàn))

創(chuàng)建一個(gè)實(shí)現(xiàn)類(lèi)的對(duì)象,該對(duì)象為業(yè)務(wù)對(duì)象,緊接著為業(yè)務(wù)對(duì)象做一個(gè)代理對(duì)象

優(yōu)點(diǎn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-669373.html

  • 非常靈活,支持任意接口類(lèi)型的實(shí)現(xiàn)類(lèi)對(duì)象做代理,也可以直接為本身做代理
  • 可以為被代理對(duì)象的所有方法做代理
  • 可以在不改變方法源碼的情況下,實(shí)現(xiàn)對(duì)方法功能的增強(qiáng)
  • 不僅簡(jiǎn)化了編程工作、提高了軟件系統(tǒng)的可擴(kuò)展性,同時(shí)也提高了開(kāi)發(fā)效率
// 返回是代理對(duì)象
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);
// loader 是定義代理類(lèi)的類(lèi)加載器
// interfaces 代理類(lèi)要實(shí)現(xiàn)的接口列表
// h 代理對(duì)象的核心處理邏輯
public class ProxyUtil {
    public static <T> T getProxy(T obj) {
        // 返回一個(gè)代理對(duì)象,給別人使用。
        // Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
        // 參數(shù)一:類(lèi)加載器,負(fù)責(zé)加載代理類(lèi)的
        // 參數(shù)二:需要被代理的方法在哪些接口中。
        // 參數(shù)三:代理對(duì)象的核心處理邏輯
        return (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 核心處理邏輯
                        // proxy  代理對(duì)象:一般不需要理會(huì)。
                        // method 代表正在被代理的方法對(duì)象。
                        // args  被代理方法的參數(shù)值。
                        // 1、記錄開(kāi)始時(shí)間
                        long startTime = System.currentTimeMillis();
                        // 2、觸發(fā)真正的業(yè)務(wù)對(duì)象的方法執(zhí)行。
                        Object result = method.invoke(obj, args);
                        // 3、記錄結(jié)束時(shí)間,統(tǒng)計(jì)耗時(shí)
                        long endTime = System.currentTimeMillis();
                        System.out.println(method.getName() + "方法耗時(shí):" + (endTime - startTime) / 1000.0 + "s!");
                        return result; // 4、返回結(jié)果。
                    }
                });
    }
}
/**
    動(dòng)態(tài)代理需要接口配合。
 */
public interface UserService {
    String login(String loginName, String passWord);
    void selectUsers();
    void deleteUsers();
}
// 創(chuàng)建業(yè)務(wù)對(duì)象
UserService userService = ProxyUtil.getProxy(new UserServiceImpl());
// 調(diào)用方法
String time = userService.login("aaa", "1111")

到了這里,關(guān)于【JAVA】單元測(cè)試、反射、注解、動(dòng)態(tài)代理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Java動(dòng)態(tài)代理、反射

    Java動(dòng)態(tài)代理、反射

    動(dòng)態(tài)代理就是無(wú)侵入式的給代碼增加新的功能,通過(guò)接口保證后面的對(duì)象和代理需要實(shí)現(xiàn)同一個(gè)接口,接口中就是被代理的所有方法,代理里面就是對(duì)象要被代理的方法。 因?yàn)橐粋€(gè)對(duì)象覺(jué)得自己身上的功能太多,就會(huì)將一部分功能代理出去,對(duì)象中什么方法想要被代理,在代

    2024年02月11日
    瀏覽(13)
  • Java_單元測(cè)試、反射

    Java_單元測(cè)試、反射

    1.1 單元測(cè)試快速入門(mén) 所謂單元測(cè)試,就是針對(duì)最小的功能單元,編寫(xiě)測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試。 我們想想,咱們之前是怎么進(jìn)行測(cè)試的呢? 比如說(shuō)我們寫(xiě)了一個(gè)學(xué)生管理系統(tǒng),有添加學(xué)生、修改學(xué)生、刪除學(xué)生、查詢(xún)學(xué)生等這些功能。要對(duì)這些功能這幾個(gè)功能進(jìn)行測(cè)試

    2024年01月18日
    瀏覽(23)
  • java的單元測(cè)試和反射

    java的單元測(cè)試和反射

    就是針對(duì)最小的功能單元,編寫(xiě)測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試 Junit單元測(cè)試框架: 可以用來(lái)對(duì)方法進(jìn)行測(cè)試 有點(diǎn): 可以靈活的編寫(xiě)測(cè)試代碼,可以針對(duì)某個(gè)方法進(jìn)行測(cè)試,也支持一鍵完成對(duì)全部方法的自動(dòng)發(fā)測(cè)試,且各自獨(dú)立 測(cè)試的方法必須是 公共,無(wú)參,無(wú)返回值 測(cè)試

    2024年04月28日
    瀏覽(14)
  • 單元測(cè)試&反射&注解

    單元測(cè)試&反射&注解

    ? ? ? ? ?就是針對(duì)最小的功能單元(方法),編寫(xiě)測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試。 ? ? ? ? ? ? 可以用來(lái)對(duì)方法進(jìn)行測(cè)試,它是由Junit公司開(kāi)源出來(lái)的? ? ? ? ? ? 反射就是:加載類(lèi),并允許以編程的方式解剖類(lèi)中的各種成分(成員變量、方法、構(gòu)造器等)。? ? ? ? ? ? ?

    2024年02月07日
    瀏覽(20)
  • Day14:?jiǎn)卧獪y(cè)試、Junit單元測(cè)試框架、反射、注解

    Day14:?jiǎn)卧獪y(cè)試、Junit單元測(cè)試框架、反射、注解

    針對(duì)最小的功能單元(方法)進(jìn)行正確性測(cè)試 編寫(xiě)正規(guī)的單元測(cè)試框架 傳統(tǒng)的無(wú)法執(zhí)行自動(dòng)化測(cè)試,且無(wú)法得到測(cè)試報(bào)告 Junit的作用: 測(cè)試類(lèi)取名:原類(lèi)名+Test(大駝峰) 測(cè)試方法取名:test+原函數(shù)名稱(chēng)(小駝峰) 測(cè)試方法:必須public,無(wú)參,無(wú)返回值 測(cè)試方法上面必須加

    2024年04月14日
    瀏覽(22)
  • Java SE 學(xué)習(xí)筆記(十七)—— 單元測(cè)試、反射

    Java SE 學(xué)習(xí)筆記(十七)—— 單元測(cè)試、反射

    開(kāi)發(fā)好的系統(tǒng)中存在很多方法,如何對(duì)這些方法進(jìn)行測(cè)試? 以前我們都是將代碼全部寫(xiě)完再進(jìn)行測(cè)試。其實(shí)這樣并不是很好。在以后工作的時(shí)候,都是寫(xiě)完一部分代碼,就測(cè)試一部分。這樣,代碼中的問(wèn)題可以得到及時(shí)修復(fù)。也避免了由于代碼過(guò)多,從而無(wú)法準(zhǔn)確定位到錯(cuò)誤

    2024年02月06日
    瀏覽(23)
  • JAVA學(xué)習(xí)-注解.基于注解的單元測(cè)試

    ? ? ? ? 基于注解的單元測(cè)試是一種使用注解來(lái)簡(jiǎn)化和增強(qiáng)測(cè)試代碼編寫(xiě)和執(zhí)行的方法。在Java中,有多個(gè)基于注解的單元測(cè)試框架可供選擇,包括JUnit、TestNG等。下面將對(duì)幾個(gè)常見(jiàn)的基于注解的單元測(cè)試框架進(jìn)行概述,并介紹它們的特點(diǎn)、使用方法以及與其他框架的比較。

    2024年04月28日
    瀏覽(20)
  • Java SE 學(xué)習(xí)筆記(十八)—— 注解、動(dòng)態(tài)代理

    Java SE 學(xué)習(xí)筆記(十八)—— 注解、動(dòng)態(tài)代理

    Java 注解(Annotation)又稱(chēng)Java標(biāo)注,是JDK 5.0引入的一種注釋機(jī)制,Java語(yǔ)言中的類(lèi)、構(gòu)造器、方法、成員變量、參數(shù)等都可以被注解進(jìn)行標(biāo)注,至于到底做何種處理由業(yè)務(wù)需求來(lái)決定。 例如: JUnit 框架中,標(biāo)記了注解 @Test 的方法就可以被當(dāng)成測(cè)試方法執(zhí)行,而沒(méi)有標(biāo)記的就不

    2024年02月08日
    瀏覽(21)
  • Java反射機(jī)制,動(dòng)態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用

    Java反射機(jī)制,動(dòng)態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用

    1.反射的基礎(chǔ)知識(shí): Java的反射機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個(gè)類(lèi)的對(duì)象,可以了解任意一個(gè)對(duì)象所屬的類(lèi),可以了解任意一個(gè)類(lèi)的成員變量和方法,可以調(diào)用任意一個(gè)對(duì)象的屬性和方法。這種動(dòng)態(tài)獲取程序信息以及動(dòng)態(tài)調(diào)用對(duì)象的功能稱(chēng)為Java語(yǔ)言的反射機(jī)

    2024年02月13日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包