Java 反射

定义

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

简而言之,反射机制可以获取任意一个类的字节码,并通过这个字节码文件创建出类对象,访问该对象。

关键词:任意,可见Java的反射机制是非常灵活的,在spring框架中得到了充分的应用 - 配置文件和类的自动装配,即 IOC 机制。

如何反射?

要使用反射机制反射出一个类,那么必须先获得类的字节码文件对象,即 .class。

如何获取类的字节码文件?有几种方式?

  1. 调用某个类的对象实例的 getClass() 方法获取

    Cat cat = new Cat();
    Class c = cat.getClass();
    
  2. 直接调用类的 .class 属性

    Class c = Cat.class();
    
  3. 使用 Class 的 forName(String className) 方法,通过类的全路径名

    Class c = Class.forName("reflect.Cat");
    reflect.Cat 是 Cat 类的全路径名
    

由于第三种方式不需要事先创建类,或者获取类,所以更灵活。 Spring 就是用这样的方式进行组件的创建,根据配置文件和反射机制和IOC创建、获取、装配组件。

使用场景

1、通过反射机制破坏单例模式

单例模式中,类的构造方法都是设置为 private 的,所以使用常规的 new 是无法创建对象的。但是,反射机制可以。

做法:我们可以先获取类的字节码文件,然后通过字节码文件获取类的构造器,将构造器可访问权限设置为 true,调用构造器的 newInstance() 获取一个对象实例。

class Cat {String name;private Cat() {}
}public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {Class<Cat> catClass = Cat.class;Constructor<Cat> cata = catClass.getDeclaredConstructor();cata.setAccessible(true);Cat cat1 = cata.newInstance();Cat cat2 = Cat.getCat();System.out.println(cat1);System.out.println(cat2);}
}

输出:

得到两个不同的对象!

2、Spring的IOC机制中的应用

Spring 是如何帮我们创建对象,并放到容器中?IOC 机制

实际上 IOC机制实际上就是使用了反射机制来实现的。

我们看下,下面的伪代码实现过程:

//解析<bean .../>元素的id属性得到该字符串值为"sqlSessionFactory"
String idStr = "sqlSessionFactory";
//解析<bean .../>元素的class属性得到该字符串值为"org.mybatis.spring.SqlSessionFactoryBean"
String classStr = "org.mybatis.spring.SqlSessionFactoryBean";
//利用反射知识,通过classStr获取Class类对象
Class cls = Class.forName(classStr);
//实例化对象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);  //当一个类里面需要用另一类的对象时,我们继续下面的操作//解析<property .../>元素的name属性得到该字符串值为“dataSource”
String nameStr = "dataSource";
//解析<property .../>元素的ref属性得到该字符串值为“dataSource”
String refStr = "dataSource";
//生成将要调用setter方法名
String setterName = "set" + nameStr.substring(0, 1).toUpperCase()                       + nameStr.substring(1);
//获取spring容器中名为refStr的Bean,该Bean将会作为传入参数
Object paramBean = container.get(refStr);
//获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象
Method setter = cls.getMethod(setterName, paramBean.getClass());
//调用invoke()方法,此处的obj是刚才反射代码得到的Object对象
setter.invoke(obj, paramBean);

是不是很熟悉,虽然是伪代码,但是和我们本篇讲的反射机制的使用是相同的,现在知道我们的反射机制用在哪了吧,没错就是我们经常提到的Java web框架中,里面就用到了反射机制,只要在代码或配置文件中看到类的完全限定名(包名+类名),即完整路径名,其底层原理基本上使用的就是Java的反射机制。

ref:

  1. https://blog.csdn.net/Appleyk/article/details/77879073
  2. https://codeantenna.com/a/USAuldhCFd

Java 反射 理解相关推荐

  1. Java反射理解与案例

    2019独角兽企业重金招聘Python工程师标准>>> https://my.oschina.net/zc741520/blog/195460 Java 反射简单理解就是通过类名或者 ...

  2. java 获取方法_Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  3. (转载)Java反射机制

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  4. Java反射机制的学习

    学习Java的同学注意了!!!  学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:434987175  我们一起学Java! Java反射机制是Java语言被视为准动 ...

  5. Java反射机制再学习

    Java反射机制的学习 Java反射机制的学习 转自:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html 总结的很到位,记录下 ...

  6. java反射各种属性获取

    ava反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用 ...

  7. Java反射机制解析

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  8. Java反射机制的学习(3)

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  9. 【转】java反射机制

    文章转自:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...

最新文章

  1. linux使用世界时间,linux世界里的时间
  2. css层叠样式表(一)
  3. iOS11和iPhone X的适配
  4. http://www.raytracegroundup.com/downloads.html 对该页的翻译。
  5. 习题:统计字符串中的单词个数
  6. 解决eclipse中tomcat无法识别maven web项目问题
  7. framebuffer驱动详解4——framebuffer驱动分析2(probe函数讲解)
  8. 2017.10.18 开店 失败总结
  9. xutils找id报空指针异常
  10. python中的doctest_Python测试框架doctest
  11. 最新亲测可用的免费google翻译api
  12. Python词频统计的3种方法
  13. Metric模块源码解析
  14. string类----猜词游戏
  15. php 黄页,PHPCMS企业黄页
  16. 【Scratch-外观模块】背景切换指令
  17. 高压电缆接地环流监测
  18. EndNote x8/ x9基础使用教程+中文毕业论文格式GB/T 7714-2005
  19. 电商系统售后履约流程
  20. TikTok推出多语种字幕和翻译工具

热门文章

  1. 计算机三级网络技术最全知识点总结【5】
  2. java怎么读取数据?
  3. Keras基础自学二十(图像旋转,图像剪切,图像移动)
  4. 香港理工大学智能计算实验室招收PhD/博士后/研究助理
  5. 2020年美容师(中级)报名考试及美容师(中级)考试总结
  6. 自媒体推广的方法和技巧有哪些?
  7. 美国劳工部揭露中国女人大数据,看完彻底傻眼了(文末有福利)
  8. Android Drawable图标生成工具
  9. 硬盘数据丢失了怎么恢复?数据恢复对策在这
  10. Cesium自定义编辑多边形