Java反射是Java非常重要的内容,Java反射的实际应用也非常广泛,下面我就全面来详解Java反射@mikechen
Java反射定义
Java反射是指在运行时动态获取一个类的信息并操作它,而无需在编译时确定类的名称和方法等信息。
这样通过Java反射就可以做在运行时获取类的完整构造,并获得类信息了,比如:属性、方法和构造函数等信息。
Java反射作用
Java反射有以下几个作用:
1.动态创建对象
通过Java反射机制,可以在运行时动态地创建类的对象,这为框架的开发、插件化等提供了可能性。
2.动态代理
Java反射机制可以实现动态代理,动态地生成代理对象,这在框架开发、AOP等方面都有应用。
3.动态获取类信息
Java反射机制可以在运行时获取类的属性、方法和构造函数等信息,而无需在编译时知道类的确切类型。
4.修改私有属性
Java反射机制可以在运行时访问类的私有属性,并进行修改,这对于测试和调试等场景非常有用。
Java反射使用
1.获取Class对象
Java反射的第一步是获取要操作的类的Class对象。
在Java中可以使用以下三种方式来获取Class对象:类名称、对象获取、字面常量获取。
1)通过类名称
使用Class.forName(“类名”)方法获取Class对象,示例:
Class<?> clazz = Class.forName("java.lang.String");
2)通过对象获取
使用Object.getClass()方法获取对象的Class对象,示例:
String str = "hello"; Class<?> clazz = str.getClass();
3)通过类字面常量获取
使用类字面常量.class获取Class对象,示例:
Class<?> clazz = String.class;
2.获取类的属性信息
Java反射可以通过Field类获取类的属性信息,Field类用于描述类的属性,包括属性名称、类型、访问修饰符等信息。
// 获取Person类的所有属性 Class<?> clazz = Person.class; Field[] fields = clazz.getDeclaredFields();
更加详细成员变量获取参考如下:
3.获得构造函数
Java反射可以通过Constructor类获取类的构造函数信息,如下所示:
//mikechen的互联网架构 Constructor[] constructors = cls.getDeclaredConstructors();
更加详细构造函数获取参考如下:
4.获取类的方法信息
Java反射可以通过Method类获取类的方法信息,如下所示:
// 获取Person类的所有方法 Class<?> clazz = Person.class; Method[] methods = clazz.getDeclaredMethods();
Method类用于描述类的方法,包括方法名称、返回值类型、参数类型、访问修饰符等信息。
Java反射原理
Java反射机制的核心原理是使用Class对象来获取并操作类的属性、方法和构造函数等信息。
Java反射原理的整个过程,主要分为如下的5大步骤:
1.java文件被编译成class文件
当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。
如下图所示:
2.加载类
加载类:在Java程序运行时,JVM会将所有类加载到内存中,并为每个类创建一个Class对象。
如下图所示:
Class对象是Java反射的核心,它包含了该类的所有信息,包括:构造函数、方法、属性等信息。
3.获取Class对象
程序需要使用Java反射机制时,它首先需要获取要操作的类的Class对象。
如下所示:
// 获取Class对象 Class<?> clazz = Class.forName("com.mikechen.MyClass");
除了使用上面的Class.forName()方法,还可以使用对象.getClass()方法,或者类字面常量.class获取Class对象
4.获取类的属性、方法和构造函数等信息
通过Class对象可以获取类的属性、方法和构造函数等信息,如下图所示:
Java反射提供了Field、Method、Constructor等类来描述类的属性、方法和构造函数等信息。
5.操作类的属性、方法和构造函数
Java反射可以通过Field类操作类的属性,通过Method类操作类的方法,通过Constructor类创建类的对象。
获取类的所有属性:
Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field.getName()); }
获取类的所有方法:
Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); }
创建对象:
Constructor<?> constructor = clazz.getConstructor(); Object obj = constructor.newInstance();
调用方法:
Method method = clazz.getDeclaredMethod("methodName", param1.getClass(), param2.getClass()); method.invoke(obj, param1, param2);
Java反射应用
Java反射应用场景,常见如下:
1.动态代理
使用反射可以在运行时动态地创建代理类,这在实现AOP(面向切面编程)时非常有用。
2.注解处理器
使用反射可以在运行时动态地解析注解,并执行注解所定义的操作,例如生成代码或加载配置文件。
3.依赖注入
使用反射可以在运行时动态地实例化对象,并将其注入到其他对象中,从而实现依赖注入的功能。
4.反射工厂
使用反射可以在运行时动态地创建对象,并执行对象的方法,这对于编写通用代码非常有用。
5.单元测试
使用反射可以在单元测试中动态地获取和修改私有变量,从而实现更完整的测试。
以上就是Java反射的详解,更多Java内容请查看:Java全面总结,强烈建议大家收藏!
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》