十分钟让你彻底搞懂java反射

如下
 
Map<String, String> map = new HashMap<>();
 
map.put(”蔡徐鸡”,”唱跳rap篮球”);
 
那反射是啥?我先不说反射是啥,概念啥的太虚幻我就不说了,把你绕蒙你这篇文章就白看了,直接举例吧
 
接着看上面的正射,如果哪天你发现用LinkedHashMap效果更好,然后你噗呲噗呲修改代码
 
Map<String, String> map = new LinkedHashMap<>();
 
map.put(”蔡徐鸡”,”唱跳rap篮球”);
 
改完了编译运行没有bug,漂亮,老板可以上线了,噗呲噗呲打包上线;然而过了两天你发现用LinkedHashMap会有隐患,还是得改回去用HashMap,成年人的崩溃如此简单,但是聪明的你想到可以加个判断,根据传入的条件来决定用HashMap还是LinkedHashMap,于是…
 
public Map<String, String> getMap(String param) {
 
    Map<String, String> map = null;
 
    if (param.equals(”HashMap”)) {
 
        map = new HashMap<>();
 
    } else if (param.equals(”LinkedHashMap”)) {
 
        map = new LinkedHashMap<>();
 
     }
 
   return map;
 
 }
 
大功告成,这么难的逻辑都被你实现了,你现在很膨胀,甚至内心隐隐觉得这破公司已经容不下你这尊大佛了
 
但是某天老大看了你的代码说:小张啊,这里你得用TreeMap;你又要噗呲噗呲改代码,哦豁
 
有没有一种办法可以让你不修改代码呢,of course、sure、必须——滴
 
这时候反射就派上用场了
 
概念:反射是Java的一种机制,让我们可以在运行时获取类的信息
 
作用:通过反射,我们可以在程序运行时动态创建对象,还能获取到类的所有信息,比如它的属性、构造器、方法、注解等;
 
直接举例吧
 
public Map<String, String> getMap(String className) {
 
    Class clazz = Class.forName(className);
 
    Constructor constructor = clazz.getConstructor();
 
    return (Map<String, String>) constructor.newInstance();
 
}
 
这时候不管你需要什么Map,只要实现了Map接口,你都能通过getMap获得,只需要传入对应Map的全限定名,例如java.util.HashMap / java.util.LinkedHashMap
 
懂了没,我问你懂了没,没懂的下面留言
 
java中反射的用法非常非常多,常见的有以下这几个:
 
一、在运行时获取一个类的 Class 对象
 
二、在运行时构造一个类的实例化对象
 
三、在运行时获取一个类的所有信息:变量、方法、构造器、注解
 
一、获取class对象
 
三种方法
 
1、类名。class:这种获取方式只有在编译前已经声明了该类的类型才能获取到 Class 对象
 
Class<HashMap> hashMap= HashMap.class;
 
2、实例。getClass():通过实例化对象获取该实例的 Class 对象
 
Map<String, String> hashMap = new HashMap<>();
 
Class<? extends Map> hashMapClass = hashMap.getClass();
 
3、Class.forName(“类的全限定名”):通过类的全限定名获取该类的 Class 对象
 
Class<?> hashMap= Class.forName(”java.util.HashMap”);
 
拿到 Class对象就可以对它为所欲为了:调用它的方法、获取属性、获取类信息,总之它在你面前就没有隐私了,好羞羞,嘤——。
 
二、构造类的实例化对象
 
通过反射构造一个类的实例方式有2种:
 
1、Class 对象调用newInstance()方法
 
Class<?> hashMapClass = Class.forName(”java.util.HashMap”);
 
HashMap hashMapInstance = (HashMap) hashMapClass.newInstance();
 
注意:即使 HashMap已经显式定义了构造方法,通过 newInstance() 创建的实例中,所有属性值都是对应类型的初始值,因为 newInstance() 构造实例会调用默认无参构造器。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64926.shtml

张贴在3