什么是反射参考:
用最直接的大白话来聊一聊Java中的反射机制
java反射的原理,作用
面试官这样问我Java反射原理,我刚好都会
反射是将Java类中的各个部分(成员变量,方法,构造方法等信息),映射成一个个的Java对象。
Java反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法。对于任意一个对象,能够调用其任意一个属性和方法。这种动态获取信息以及动态调用对象方法的功能称为Java的反射基础。
如何得到想反射的类我们编写的代码存储在后缀.java的文件中,最终会被编译为.class文件被执行。Java认为万物皆对象,这些编译后的.class文件也是一种对象,Java将其抽象成了一种类,这个类就是Class。
通过Class类可以得到我们想反射的类,想要反射第一步就是获得类的字节码,获得类的字节码方式有如下三种:
1.静态方法Class.forName("包类路径");
2.object.getClass(); 对象调用getClass()方法;
3.Class clazz = 类.class; 通过类.class获取;
编译阶段:将类的源码通过Javac编译成字节码文件。
运行阶段:遇到了新建类的对象,触发了类加载器ClassLoader根据类的全限定名将类的字节码文件加载至JVM的方法区,然后将其转换成对应的Class对象实例至Java堆中,Java堆中。(反射就是在加载到jvm中的.class文件操作的)
Class类阶段(加载阶段):分别将成员变量Field[] fields、构造器Constructor[] cons、成员方法Method[] ms看做成对象。
常用函数Field 成员变量
通过Class类的getDeclaredField(),getDeclaredFields()获取本类声明的字段。
Constructor 构造器
通过Class类实例的getConstructor(Class>…parameterTypes)获取构造方法;
私有构造函数要设定Contructor实例.setAccessible(true);暴力反射获取。
Method 方法
包括类的静态方法和成员方法(包括抽象方法)。
通过Method类实例.invoke(Object obj,Object…args)完成方法调用。
通过public Method getMethod(String name,Class>… parameterTypes)获取类的方法。
应用场景1.Spring配置文件中bean生成对象实例,就是反射实现的。框架不知道类或对象的具体信息,将类的名称放在XMl文件中,属性和属性值也放在XML文件中。运行时再去读取XML文件并且动态获取类的信息,利用反射操作对象的set、get方法,将属性数据封装到Java对象中。
2.框架中的注解也是应用反射。
3.IDE自动提示功能应用反射。



