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

Java反射與自定義注解實戰(zhàn)指南詳解

 更新時間:2025年07月01日 09:16:57   作者:佛祖讓我來巡山  
本文介紹Java反射機制及自定義注解應用,涵蓋反射核心類、操作方式與性能優(yōu)化,以及注解定義、SpringBoot集成和AOP處理,強調二者在框架開發(fā)中的協(xié)同作用,提升系統(tǒng)靈活性和擴展性,感興趣的朋友跟隨小編一起看看吧

第一部分:Java反射核心機制

一、反射的本質與價值

反射是Java在運行時動態(tài)獲取類信息并操作類的能力,它是框架設計的基石。通過反射,我們可以在運行時:

  • 獲取類的完整結構(類名、方法、屬性等)
  • 動態(tài)創(chuàng)建對象
  • 調用方法和訪問字段(包括私有成員)
  • 實現(xiàn)動態(tài)代理

二、反射核心類

類名用途
Class類的元數(shù)據(jù)入口
Field類的成員變量
Method類的方法
Constructor類的構造方法

三、獲取Class對象的三種方式

// 1. 類名.class(最安全高效)
Class<String> clazz1 = String.class;
// 2. 對象.getClass()
String s = "";
Class<?> clazz2 = s.getClass();
// 3. Class.forName()(最靈活)
Class<?> clazz3 = Class.forName("java.lang.String");

四、反射基礎操作

1. 創(chuàng)建對象

// 無參構造
Class<?> clazz = User.class;
User user = clazz.getDeclaredConstructor().newInstance();
// 有參構造
Constructor<?> cons = clazz.getConstructor(String.class, int.class);
User user = (User) cons.newInstance("Alice", 25);

2. 操作字段

Field field = clazz.getDeclaredField("name");
field.setAccessible(true); // 突破私有限制
// 設置值
field.set(user, "Bob");
// 獲取值
String name = (String) field.get(user);

3. 調用方法

Method method = clazz.getMethod("setName", String.class);
method.invoke(user, "Charlie"); // 調用方法

五、反射應用場景

  • 框架設計(如Spring IOC容器)
  • 動態(tài)代理
  • 注解處理器
  • JSON序列化/反序列化

性能提示:反射操作比直接調用慢10-100倍,高頻場景建議緩存Method/Field對象。

第二部分:自定義注解與Spring Boot實戰(zhàn)

一、自定義注解基礎

1. 元注解(定義注解的注解)

元注解作用
@Target指定注解作用目標(類/方法/字段)
@Retention指定注解保留策略(SOURCE/CLASS/RUNTIME
@Documented是否包含在Javadoc中
@Inherited是否允許子類繼承

2. 定義注解

// 示例:方法耗時監(jiān)控注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeMonitor {
    String taskName() default ""; // 屬性帶默認值
    int threshold() default 1000; // 超時閾值(毫秒)
}

二、Spring Boot中自定義注解實戰(zhàn)

1. 使用注解

@Service
public class OrderService {
    @TimeMonitor(taskName = "訂單處理", threshold = 500)
    public void processOrder() {
        // 業(yè)務代碼...
    }
}

2. 處理注解(AOP方式)

@Aspect // 聲明為切面
@Component // 納入Spring容器
public class TimeMonitorAspect {
    /**
     * 環(huán)繞通知:攔截帶@TimeMonitor注解的方法
     */
    @Around("@annotation(monitor)")
    public Object monitorTime(ProceedingJoinPoint pjp, TimeMonitor monitor) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = pjp.proceed(); // 執(zhí)行目標方法
        long cost = System.currentTimeMillis() - start;
        // 超過閾值打印警告
        if (cost > monitor.threshold()) {
            System.err.printf("[%s] 執(zhí)行耗時 %dms (超過閾值 %dms)%n",
                monitor.taskName(), cost, monitor.threshold());
        }
        return result;
    }
}

三、實際應用場景

場景1:權限控制注解

// 定義注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Auth {
    String[] roles() default {"USER"}; // 允許的角色
}
// 使用
@RestController
public class AdminController {
    @Auth(roles = {"ADMIN"})
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) { ... }
}
// AOP權限校驗
@Around("@annotation(auth)")
public Object checkAuth(ProceedingJoinPoint pjp, Auth auth) {
    // 獲取當前用戶角色
    Set<String> userRoles = getCurrentUserRoles();
    // 檢查權限
    if (!hasRequiredRole(userRoles, auth.roles())) {
        throw new AccessDeniedException("權限不足");
    }
    return pjp.proceed();
}

場景2:自動日志注解

// 定義
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoLog {
    String value() default "";
}
// AOP處理
@Around("@annotation(log)")
public Object logMethod(ProceedingJoinPoint pjp, AutoLog log) throws Throwable {
    String methodName = pjp.getSignature().getName();
    System.out.println("【" + log.value() + "】開始執(zhí)行: " + methodName);
    Object result = pjp.proceed();
    System.out.println("【" + log.value() + "】執(zhí)行完成");
    return result;
}

四、Spring Boot集成關鍵點

  • 組件掃描

    • 確保注解定義類在@SpringBootApplication掃描路徑下
    • AOP處理類需添加@Component注解
  • AOP代理配置

    # application.properties
    spring.aop.auto=true # 啟用AOP自動代理
    spring.aop.proxy-target-class=true # 使用CGLIB代理
  • 注解屬性設計原則

    • 優(yōu)先使用value作為主屬性名
    • 為所有屬性提供默認值
    • 復雜配置使用嵌套注解

五、反射與注解的協(xié)同工作

// 反射方式讀取注解信息
public void scanAnnotations() {
    Class<?> clazz = OrderService.class;
    for (Method method : clazz.getDeclaredMethods()) {
        if (method.isAnnotationPresent(TimeMonitor.class)) {
            TimeMonitor monitor = method.getAnnotation(TimeMonitor.class);
            System.out.println("監(jiān)控方法: " + monitor.taskName());
        }
    }
}

總結對比

特性反射自定義注解
主要目的運行時操作類為代碼添加元數(shù)據(jù)
核心類Class, Method, Field@interface
使用場景框架開發(fā)、動態(tài)代理AOP增強、配置聲明
Spring Boot集成直接可用需配合AOP或反射處理
性能影響較大(需緩存優(yōu)化)較小(AOP有代理開銷)
典型應用Spring IOC容器Spring聲明式事務(@Transactional)

最佳實踐建議

  • 優(yōu)先使用注解+AOP實現(xiàn)通用功能
  • 反射用于無法通過注解實現(xiàn)的動態(tài)場景
  • 高頻操作務必進行性能優(yōu)化
  • 合理設計注解屬性,保持簡潔性

掌握反射和自定義注解,將使你能夠深入理解Java生態(tài)框架的工作原理,并能夠設計和實現(xiàn)更加靈活、可擴展的系統(tǒng)架構。

到此這篇關于Java反射與自定義注解實戰(zhàn)指南詳解的文章就介紹到這了,更多相關Java反射與自定義注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務的示例代碼

    使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務的示例代碼

    許多公司處理的用戶敏感數(shù)據(jù)由于法律限制不能永久存儲,根據(jù)規(guī)定,這些數(shù)據(jù)的存儲時間不能超過預設期限,并且最好在用于服務目的之后就將其刪除,解決這個問題有多種可能的方案,在本文中,我想展示一個利用 Spring 和 Redis 處理敏感數(shù)據(jù)的應用程序的簡化示例
    2025-04-04
  • Spring session實現(xiàn)共享單點登錄案例過程解析

    Spring session實現(xiàn)共享單點登錄案例過程解析

    這篇文章主要介紹了Spring session實現(xiàn)共享單點登錄案例過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java接口操作(繼承父類并實現(xiàn)多個接口)

    Java接口操作(繼承父類并實現(xiàn)多個接口)

    這篇文章主要介紹了Java接口操作(繼承父類并實現(xiàn)多個接口),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java Http接口加簽、驗簽操作方法

    Java Http接口加簽、驗簽操作方法

    下面小編就為大家?guī)硪黄狫ava Http接口加簽、驗簽操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • java 回調機制的實例詳解

    java 回調機制的實例詳解

    這篇文章主要介紹了java 回調機制的實例詳解的相關資料,希望通過本文的示例能幫助到大家理解使用回調機制,需要的朋友可以參考下
    2017-09-09
  • 利用Java代碼寫一個并行調用模板

    利用Java代碼寫一個并行調用模板

    這篇文章主要介紹了利用Java代碼寫一個并行調用模板,文章基于Java的相關內容展開寫一個并行調用模板的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • @Async導致controller?404及失效原因解決分析

    @Async導致controller?404及失效原因解決分析

    這篇文章主要為大家介紹了@Async導致controller?404失效問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java基于ShardingSphere實現(xiàn)分庫分表的實例詳解

    Java基于ShardingSphere實現(xiàn)分庫分表的實例詳解

    ShardingSphere?已于2020年4月16日成為?Apache?軟件基金會的頂級項目,?它們均提供標準化的數(shù)據(jù)水平擴展、分布式事務和分布式治理等功能,可適用于如?Java?同構、異構語言、云原生等各種多樣化的應用場景,對ShardingSphere分庫分表相關知識感興趣的朋友一起看看吧
    2022-03-03
  • SSM+微信小程序實現(xiàn)物業(yè)管理系統(tǒng)及實例代碼

    SSM+微信小程序實現(xiàn)物業(yè)管理系統(tǒng)及實例代碼

    這篇文章主要介紹了SSM+微信小程序實現(xiàn)物業(yè)管理系統(tǒng),ssm微信小程序物業(yè)管理系統(tǒng),有網(wǎng)站后臺管理系統(tǒng),本文通過實例代碼給大家展示系統(tǒng)的功能,需要的朋友可以參考下
    2022-02-02
  • mybatis-plus中BaseMapper入門使用

    mybatis-plus中BaseMapper入門使用

    本文主要介紹了mybatis-plus中BaseMapper入門使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論