1、繞過 編譯階段 為集合添加數(shù)據(jù)
- 反射是作用在運行時的技術(shù),此時集合的泛型將不能產(chǎn)生約束了,此時是可以 為集合存入其他任意類型的元素的 。
- 泛型只是在編譯階段可以約束集合只能操作某種數(shù)據(jù)類型,在 編譯成Class文件進入 運行階段 的時候,其真實類型都是不帶泛型的集合,泛型相當(dāng)于被擦除了。
package com.csdn.d6_reflect_genericity; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class ReflectDemo { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { //需求:反射實現(xiàn)泛型擦除后,加入其他類型的元素 ArrayList<String> list1 = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(); System.out.println(list1.getClass());//class java.util.ArrayList System.out.println(list2.getClass());//class java.util.ArrayList System.out.println(list1.getClass() == list2.getClass());//true System.out.println("==============================="); ArrayList<Integer> list3 = new ArrayList<>(); list3.add(23); list3.add(22); Class<? extends ArrayList> aClass = list3.getClass(); Method add = aClass.getDeclaredMethod("add", Object.class); boolean rs = (boolean) add.invoke(list3, "反射"); System.out.println(rs);//true System.out.println(list3);//[23, 22, 反射] ArrayList list4 = list3; list4.add("注解"); list4.add(false); System.out.println(list3);//[23, 22, 反射, 注解, false] } }
1.1、反射為何可以給約定了泛型的集合存入其他類型的元素?
- 編譯成Class文件進入運行階段 的時候,泛型會自動擦除 。
- 反射是作用在 運行時 的技術(shù),此時已經(jīng)不存在泛型了 。
?2、通用框架的底層原理
需求
- 給定任意一個對象,在不清楚對象字段的情況下,可以把對象的字段名稱和對應(yīng)值存儲到文件中去。
分析文章來源:http://www.zghlxwxcb.cn/news/detail-721755.html
- 定義一個 方法 ,可以接收任意類的對象
- 每次收到一個對象后,需要解析這個對象的 全部成員變量名稱
- 這個對象可能是 任意 的,那么怎么樣才可以知道這個對象的全部成員變量名稱呢
- 使用 反射 獲取對象的 Class類對象 ,然后獲取全部成員變量信息
- 遍歷成員變量信息,然后提取本成員變量在對象中的 具體值
- 存入成員變量名稱和值到 文件 中去即可
package com.csdn.d7_reflect_framework; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.lang.reflect.Field; /** * 目標(biāo):提供一個通用框架,支持保存所有對象的具體信息。 */ public class ReflectDemo { public static void main(String[] args) { Student student = new Student("反射", '男', 100, "JavaSE", "暴力訪問"); MybatisUtil.save(student); Teacher teacher = new Teacher("注解", '女', 10000); MybatisUtil.save(teacher); } } class MybatisUtil { public static void save(Object object) { try { try (PrintStream ps = new PrintStream(new FileOutputStream("reflect\\src\\main\\java\\com\\csdn\\d7_reflect_framework\\object.txt",true))) { //1、提取這個對象的全部成員變量:只能反射可以解決 Class<?> aClass = object.getClass(); ps.println("==============" + aClass.getSimpleName() + "================"); //2、提取它的全部成員變量 Field[] fields = aClass.getDeclaredFields(); //3、獲取成員變量的信息 for (Field field : fields) { String name = field.getName(); //提取本成員變量的object對象中的值(取值) field.setAccessible(true); String value = field.get(object) + ""; ps.println(name + "=" + value); } } } catch (IllegalAccessException | FileNotFoundException e) { throw new RuntimeException(e); } } } @Data @AllArgsConstructor @NoArgsConstructor class Student { private String name; private char sex; private int age; private String className; private String hobby; } @Data @AllArgsConstructor @NoArgsConstructor class Teacher { private String name; private char sex; private double salary; }
?
文章來源地址http://www.zghlxwxcb.cn/news/detail-721755.html
?3、反射的作用?
- 可以在運行時得到一個 類的 全部成分 然后操作
- 可以 破壞封裝性(很突出)
- 也可以 破壞泛型的約束性(很突出)
- 更重要的用途是適合:做 Java 高級框架
到了這里,關(guān)于反射的作用( 越過泛型檢查 和 可以使用反射保存所有對象的具體信息 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!