国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java 反射機(jī)制與 Spring 框架的深度整合

開發(fā) 前端
Java反射機(jī)制的核心在于JVM在運(yùn)行時(shí)會(huì)為每個(gè)類生成一個(gè)對(duì)應(yīng)的java.lang.Class對(duì)象,該對(duì)象包含了該類的完整結(jié)構(gòu)信息。通過這個(gè)Class對(duì)象,程序可以在運(yùn)行時(shí)獲取類的所有信息,包括類的名稱、方法、字段、構(gòu)造函數(shù)等,并且可以動(dòng)態(tài)地創(chuàng)建對(duì)象、調(diào)用方法、訪問和修改字段值。

前言

Java反射機(jī)制是Java語言提供的一項(xiàng)強(qiáng)大功能,它允許程序在運(yùn)行時(shí)動(dòng)態(tài)地獲取類的信息、創(chuàng)建對(duì)象、調(diào)用方法以及訪問和修改字段。

基本原理

Java反射機(jī)制的核心在于JVM在運(yùn)行時(shí)會(huì)為每個(gè)類生成一個(gè)對(duì)應(yīng)的java.lang.Class對(duì)象,該對(duì)象包含了該類的完整結(jié)構(gòu)信息。通過這個(gè)Class對(duì)象,程序可以在運(yùn)行時(shí)獲取類的所有信息,包括類的名稱、方法、字段、構(gòu)造函數(shù)等,并且可以動(dòng)態(tài)地創(chuàng)建對(duì)象、調(diào)用方法、訪問和修改字段值。

反射機(jī)制的工作流程如下:

  • JVM加載類時(shí),會(huì)為該類生成一個(gè)唯一的Class對(duì)象。
  • 通過Class對(duì)象可以獲取該類的所有信息,包括方法、字段、構(gòu)造函數(shù)等。
  • 利用反射API可以在運(yùn)行時(shí)操作這些信息,例如創(chuàng)建對(duì)象、調(diào)用方法、訪問和修改字段值。

反射機(jī)制的核心 API

Class 類

Class類是反射機(jī)制的基礎(chǔ),它代表一個(gè)類或接口。獲取Class對(duì)象的三種主要方式:

// 方式一:通過類名獲取
Class<?> clazz1 = String.class;

// 方式二:通過對(duì)象實(shí)例獲取
String str = "hello";
Class<?> clazz2 = str.getClass();

// 方式三:通過類的全限定名獲取
try {
    Class<?> clazz3 = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Constructor 類

Constructor類表示類的構(gòu)造函數(shù),用于創(chuàng)建對(duì)象實(shí)例:

try {
    // 獲取String類的構(gòu)造函數(shù)
    Constructor<String> constructor = String.class.getConstructor(String.class);
    // 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
    String str = constructor.newInstance("hello");
} catch (Exception e) {
    e.printStackTrace();
}

Method 類

Method類表示類的方法,用于調(diào)用方法:

try {
    // 獲取String類的length()方法
    Method method = String.class.getMethod("length");
    // 調(diào)用方法
    String str = "hello";
    int length = (int) method.invoke(str);
} catch (Exception e) {
    e.printStackTrace();
}

Field 類

Field類表示類的字段,用于訪問和修改字段值:

try {
    // 獲取Person類的name字段
    Field field = Person.class.getDeclaredField("name");
    // 設(shè)置可訪問(即使是private字段)
    field.setAccessible(true);
    // 創(chuàng)建Person對(duì)象
    Person person = new Person();
    // 設(shè)置字段值
    field.set(person, "John");
    // 獲取字段值
    String name = (String) field.get(person);
} catch (Exception e) {
    e.printStackTrace();
}

class Person {
    private String name;
}

Modifier 類

Modifier類用于獲取類、方法、字段的修飾符信息:

try {
    Field field = Person.class.getDeclaredField("name");
    int modifiers = field.getModifiers();
    System.out.println("Is private: " + Modifier.isPrivate(modifiers));
    System.out.println("Is static: " + Modifier.isStatic(modifiers));
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

應(yīng)用場景

框架開發(fā)

許多Java框架(如Spring、Hibernate、JUnit 等)都依賴反射機(jī)制實(shí)現(xiàn)其核心功能。例如,Spring框架通過反射機(jī)制實(shí)現(xiàn)Bean的自動(dòng)裝配和依賴注入:

// Spring框架中的依賴注入示例
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    // 其他方法
}

JSON 序列化與反序列化

JSON處理庫(如Jackson、Gson)使用反射機(jī)制將Java對(duì)象轉(zhuǎn)換為JSON格式,以及將JSON數(shù)據(jù)轉(zhuǎn)換為Java對(duì)象:

public class JsonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        Person person = new Person("John", 30);
        
        // 對(duì)象轉(zhuǎn)JSON
        String json = mapper.writeValueAsString(person);
        
        // JSON轉(zhuǎn)對(duì)象
        Person newPerson = mapper.readValue(json, Person.class);
    }
}

插件系統(tǒng)

反射機(jī)制可以用于實(shí)現(xiàn)插件系統(tǒng),允許程序在運(yùn)行時(shí)動(dòng)態(tài)加載和使用外部插件:

public class PluginLoader {
    public static void loadPlugin(String pluginPath) throws Exception {
        File file = new File(pluginPath);
        URL url = file.toURI().toURL();
        URLClassLoader classLoader = new URLClassLoader(new URL[]{url});
        
        // 加載插件類
        Class<?> pluginClass = classLoader.loadClass("com.example.MyPlugin");
        
        // 創(chuàng)建插件實(shí)例并調(diào)用方法
        Object plugin = pluginClass.getDeclaredConstructor().newInstance();
        pluginClass.getMethod("execute").invoke(plugin);
    }
}

注解處理

反射機(jī)制可以用于處理注解,例如在運(yùn)行時(shí)獲取和解析注解信息:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
    String value() default "";
}

public class AnnotationProcessor {
    public static void processAnnotations(Class<?> clazz) {
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            if (method.isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
                System.out.println("Method: " + method.getName() + ", Annotation value: " + annotation.value());
            }
        }
    }
}

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 靈活性高:反射機(jī)制允許程序在運(yùn)行時(shí)動(dòng)態(tài)地操作類和對(duì)象,提高了程序的靈活性和擴(kuò)展性。
  • 可擴(kuò)展性強(qiáng):框架開發(fā)者可以利用反射機(jī)制實(shí)現(xiàn)通用的功能,使得框架可以適應(yīng)不同的應(yīng)用場景。
  • 簡化代碼:反射機(jī)制可以減少重復(fù)代碼,提高代碼的復(fù)用性。

缺點(diǎn):

  • 性能開銷大:反射操作涉及到動(dòng)態(tài)解析類和方法,比直接調(diào)用方法的性能要低得多。
  • 安全風(fēng)險(xiǎn)高:反射機(jī)制可以訪問和修改類的私有成員,可能破壞類的封裝性,增加安全風(fēng)險(xiǎn)。
  • 代碼可讀性差:反射代碼通常比較復(fù)雜,可讀性和可維護(hù)性較差。

性能優(yōu)化

反射對(duì)象(如Method、Field、Constructor 等)的獲取是比較耗時(shí)的操作,建議在第一次獲取后進(jìn)行緩存,避免重復(fù)獲取:

public class ReflectionCache {
    private static final Map<String, Method> methodCache = new HashMap<>();
    
    public static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {
        String key = clazz.getName() + "." + methodName;
        for (Class<?> paramType : parameterTypes) {
            key += "_" + paramType.getName();
        }
        
        Method method = methodCache.get(key);
        if (method == null) {
            method = clazz.getMethod(methodName, parameterTypes);
            method.setAccessible(true); // 提高性能
            methodCache.put(key, method);
        }
        return method;
    }
}

工具類:

/**
 * 基于Spring框架ReflectionUtils的增強(qiáng)工具類,提供更豐富的反射操作功能
 */
public class SpringReflectionUtils {

    /**
     * 創(chuàng)建對(duì)象實(shí)例
     * @param clazz 類對(duì)象
     * @param <T> 對(duì)象類型
     * @return 對(duì)象實(shí)例
     * @throws RuntimeException 如果創(chuàng)建對(duì)象失敗
     */
    public static <T> T newInstance(Class<T> clazz) {
        try {
            return clazz.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException |
                 NoSuchMethodException | InvocationTargetException e) {
            throw new RuntimeException("Failed to create instance of " + clazz, e);
        }
    }

    /**
     * 查找類中符合條件的所有字段
     * @param clazz 目標(biāo)類
     * @param predicate 字段過濾條件
     * @return 符合條件的字段列表
     */
    public static List<Field> findFields(Class<?> clazz, Predicate<Field> predicate) {
        List<Field> fields = new ArrayList<>();
        ReflectionUtils.doWithFields(clazz, fields::add, field -> predicate.test(field));
        return fields;
    }

    /**
     * 獲取對(duì)象字段的值
     * @param target 對(duì)象實(shí)例
     * @param fieldName 字段名
     * @return 字段值
     */
    public static Object getFieldValue(Object target, String fieldName) {
        Field field = ReflectionUtils.findField(target.getClass(), fieldName);
        if (field == null) {
            throw new IllegalArgumentException("Field " + fieldName + " not found");
        }
        ReflectionUtils.makeAccessible(field);
        return ReflectionUtils.getField(field, target);
    }

    /**
     * 設(shè)置對(duì)象字段的值
     * @param target 對(duì)象實(shí)例
     * @param fieldName 字段名
     * @param value 要設(shè)置的值
     */
    public static void setFieldValue(Object target, String fieldName, Object value) {
        Field field = ReflectionUtils.findField(target.getClass(), fieldName);
        if (field == null) {
            throw new IllegalArgumentException("Field " + fieldName + " not found");
        }
        ReflectionUtils.makeAccessible(field);
        ReflectionUtils.setField(field, target, value);
    }

    /**
     * 查找類中符合條件的所有方法
     * @param clazz 目標(biāo)類
     * @param predicate 方法過濾條件
     * @return 符合條件的方法列表
     */
    public static List<Method> findMethods(Class<?> clazz, Predicate<Method> predicate) {
        List<Method> methods = new ArrayList<>();
        ReflectionUtils.doWithMethods(clazz, methods::add, method -> predicate.test(method));
        return methods;
    }

    /**
     * 調(diào)用對(duì)象的方法
     * @param target 對(duì)象實(shí)例
     * @param methodName 方法名
     * @param args 方法參數(shù)
     * @return 方法返回值
     */
    public static Object invokeMethod(Object target, String methodName, Object... args) {
        Class<?>[] parameterTypes = Arrays.stream(args)
                .map(arg -> arg == null ? null : arg.getClass())
                .toArray(Class<?>[]::new);

        Method method = ReflectionUtils.findMethod(target.getClass(), methodName, parameterTypes);
        if (method == null && parameterTypes.length > 0) {
            // 嘗試不指定參數(shù)類型查找方法
            method = ReflectionUtils.findMethod(target.getClass(), methodName);
        }

        if (method == null) {
            throw new IllegalArgumentException("Method " + methodName + " not found");
        }

        ReflectionUtils.makeAccessible(method);
        return ReflectionUtils.invokeMethod(method, target, args);
    }

    /**
     * 將對(duì)象的所有屬性轉(zhuǎn)換為Map
     * @param obj 對(duì)象實(shí)例
     * @return 包含對(duì)象屬性的Map
     */
    public static Map<String, Object> objectToMap(Object obj) {
        Map<String, Object> map = new HashMap<>();
        ReflectionUtils.doWithFields(obj.getClass(), field -> {
            ReflectionUtils.makeAccessible(field);
            map.put(field.getName(), field.get(obj));
        }, field -> !ReflectionUtils.isPublicStaticFinal(field));
        return map;
    }

    /**
     * 將Map中的鍵值對(duì)設(shè)置到對(duì)象的對(duì)應(yīng)屬性中
     * @param map 包含屬性值的Map
     * @param target 對(duì)象實(shí)例
     */
    public static void mapToObject(Map<String, ?> map, Object target) {
        map.forEach((key, value) -> {
            Field field = ReflectionUtils.findField(target.getClass(), key);
            if (field != null) {
                ReflectionUtils.makeAccessible(field);
                ReflectionUtils.setField(field, target, value);
            }
        });
    }

    /**
     * 獲取類的所有公共方法
     * @param clazz 目標(biāo)類
     * @return 公共方法列表
     */
    public static List<Method> getPublicMethods(Class<?> clazz) {
        return findMethods(clazz, method -> Modifier.isPublic(method.getModifiers()));
    }

    /**
     * 獲取類的所有公共字段
     * @param clazz 目標(biāo)類
     * @return 公共字段列表
     */
    public static List<Field> getPublicFields(Class<?> clazz) {
        return findFields(clazz, field -> Modifier.isPublic(field.getModifiers()));
    }

    /**
     * 檢查類是否包含指定注解
     * @param clazz 目標(biāo)類
     * @param annotationClass 注解類
     * @return 如果包含注解返回true,否則返回false
     */
    public static boolean hasAnnotation(Class<?> clazz, Class<?> annotationClass) {
        return clazz.isAnnotationPresent((Class<? extends Annotation>) annotationClass);
    }

    /**
     * 檢查方法是否包含指定注解
     * @param method 目標(biāo)方法
     * @param annotationClass 注解類
     * @return 如果包含注解返回true,否則返回false
     */
    public static boolean hasAnnotation(Method method, Class<?> annotationClass) {
        return method.isAnnotationPresent((Class<? extends Annotation>) annotationClass);
    }

    /**
     * 檢查字段是否包含指定注解
     * @param field 目標(biāo)字段
     * @param annotationClass 注解類
     * @return 如果包含注解返回true,否則返回false
     */
    public static boolean hasAnnotation(Field field, Class<?> annotationClass) {
        return field.isAnnotationPresent((Class<? extends Annotation>) annotationClass);
    }

    // 私有構(gòu)造函數(shù),防止實(shí)例化
    private SpringReflectionUtils() {}
}


責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2021-02-23 08:18:04

Java 反射機(jī)制

2009-06-01 10:28:03

SpringOSGi整合

2012-04-05 13:50:38

Java

2011-04-01 14:50:56

Java的反射機(jī)制

2010-04-01 09:22:38

代理模式Java反射機(jī)制

2023-10-17 09:26:44

Java工具

2024-10-12 12:55:26

2012-02-08 10:37:42

Java反射

2010-08-03 09:15:05

ScalaSpring

2011-09-27 10:23:24

Java反射機(jī)制

2017-05-17 15:28:15

Java反射機(jī)制

2011-03-09 09:11:52

java反射機(jī)制

2017-03-24 09:44:33

Java反射機(jī)制

2022-10-21 14:12:06

2009-10-13 09:05:45

反射機(jī)制

2009-06-25 17:13:51

jBPM與Spring

2009-07-14 14:41:33

Webwork與Spr

2009-07-09 18:24:00

WebWork與Spr

2011-05-26 15:23:34

JavaReflection

2009-06-17 13:57:54

java實(shí)例Reflection
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

天堂成人在线| 樱花影视一区二区| 精品电影在线观看| 国产精品久久久久久久久久久新郎| 成人有码在线播放| 黄色毛片av| 热舞福利精品大尺度视频| 9久久9毛片又大又硬又粗| 成人在线观看免费播放| 奇米在线7777在线精品| 日韩三级免费观看| 91成人综合网| 2021年精品国产福利在线| 国产精品免费久久| 五月天在线免费视频| a亚洲天堂av| av电影在线免费| 国产一区二区av在线| 成人午夜伦理影院| www黄色日本| 国产精品久久久久影院| 国产九一视频| 午夜激情一区二区三区| 成人女人a毛片在线看| www.亚洲色图.com| 亚洲一二三四区不卡| 色琪琪免费视频网站| 亚洲国产一区视频| 在线天堂资源| 日韩视频国产视频| 日韩电影网址| 成人爽a毛片一区二区免费| 91精品国产综合久久久久久蜜臀| 黄色在线观看视频网站| 国产精品视频第一区| 久久66热这里只有精品| 久久综合资源网| 欧美自拍大量在线观看| 91高清在线| 一区二区免费在线播放| 66av99| 蜜桃麻豆影像在线观看| 黑人巨大精品| 欧美区视频在线观看| 91插插插插插插插插| 日本美女视频一区二区| 国产日韩在线看| 韩日一区二区三区| 亚洲国产又黄又爽女人高潮的| 国产午夜精品一区理论片| 久久婷婷国产综合国色天香| 成年人精品视频| 欧美日韩不卡| 91精品国产91久久久久| 婷婷久久综合九色综合绿巨人 | 午夜精品亚洲一区二区三区嫩草 | 日韩欧美激情一区| 高清在线一区二区| 亚洲欧美日韩系列| 精品欧美日韩| 欧美亚洲三级| 伊人久久大香线蕉av一区| 久草在线成人| 国产综合成人久久大片91| 91在线观看地址| 中文字幕永久视频| 亚洲视频免费观看| 国产视频资源| 色域天天综合网| 在线免费看黄网站| 精品久久人人做人人爽| 日韩在线免费看| 麻豆精品一区二区三区| 欧美黑人性生活视频| 成人看片网页| 精品亚洲欧美一区| 在线观看h网| 爱看av在线入口| 欧美电影免费提供在线观看| 黑人巨大精品| 欧美中文字幕视频| 亚洲无吗在线| 天天干天天色天天爽| 国产欧美精品一区二区三区四区| 亚洲美女视频在线观看| 久青草国产在线| 欧美大片va欧美在线播放| 久久久久久久久久久久久久| 99久久综合狠狠综合久久止| 国产aⅴ夜夜欢一区二区三区 | 中文字幕乱码在线播放| 欧美一区二区女人| 欧美大片免费| 久久久久久久久久国产| 91精品国产麻豆国产在线观看| 亚洲情趣在线观看| 日韩子在线观看| 日韩精品久久久久| 亚洲第一久久影院| 成人高清视频免费观看| 国产一区二区三区无遮挡| 国产成人午夜99999| 成年人福利视频| 欧亚一区二区三区| 亚洲深深色噜噜狠狠爱网站| 你懂的在线观看| 亚洲a级在线播放观看| 九九久久精品视频| caoporn免费在线| 国产欧美一区二区白浆黑人| 中文在线一区二区| 青草热久免费精品视频| 国产又色又爽又黄刺激在线视频| 亚洲综合免费观看高清完整版在线 | 欧美综合亚洲图片综合区| av激情网站| 欧美美女18p| 国产精品每日更新| 四虎影视精品| 免费黄网站在线播放| av免费观看久久| 欧美二区在线观看| 91精品福利| 成人性生交大片免费看在线播放| 96国产粉嫩美女| 性做久久久久久免费观看| 日韩av首页| 欧美黄网在线观看| 91精品在线观看入口| 日韩av超清在线观看| 亚洲v国产v在线观看| 精品视频久久久久久久| 亚洲国产视频直播| 看全色黄大色大片| 国产欧美日本| 日本成本人片免费观看| 亚洲跨种族黑人xxx| 国内精品久久久久久久97牛牛| 另类图片亚洲色图| 久久成人在线视频| 国产99久久久久| 91精品国产高清| 色婷婷av一区二区三区大白胸 | 日韩黄色大片网站| 毛片免费在线观看| 天堂8在线天堂资源bt| 欧美成人合集magnet| 亚洲综合av网| 性伦欧美刺激片在线观看| 国产亚洲毛片| 91色porny| 狠狠色狠狠色综合系列| 一区不卡字幕| 欧美性受xxxx黑人xyx| 少妇精品久久久一区二区三区| 成人在线激情网| 欧美大成色www永久网站婷| 亚洲美女少妇无套啪啪呻吟| 写真福利理论片在线播放| 777午夜精品福利在线观看| 国产亚洲福利社区一区| 日韩三级久久| 日韩av手机版| 668精品在线视频| 亚洲免费大片在线观看| 久久99精品久久久久久园产越南| 苍井空浴缸大战猛男120分钟| 两个人的视频www国产精品| 日韩影视在线| 黄页视频在线免费观看| 日本一区二区在线视频| 欧美怡红院视频一区二区三区| 日韩福利在线播放| 欧美日韩亚洲高清| 亚洲一区二区在线观看视频| 99精品欧美一区二区蜜桃免费 | 国产精品午夜视频| 91精品国产综合久久久蜜臀粉嫩| 亚洲欧美视频一区| 18欧美乱大交hd1984| 精彩视频一区二区| 日韩不卡一区| 亚洲另类春色校园小说| 日韩视频在线观看免费| 日韩精品最新网址| 国产亚洲精品激情久久| 777久久久精品| 国产精品99免费看| 亚洲一级黄色av| 成人免费毛片片v| 91国内精品白嫩初高生| 美乳在线观看| 国产伦精品一区二区三区视频孕妇 | 青青草综合在线| 91午夜国产| 先锋成人影院| 久久青草伊人| 欧美精品国产一区| 懂色av一区二区三区蜜臀| 超碰在线影院|