Java反射详解(万字图文全面总结)

Java反射详解(万字图文全面总结)-mikechen

Java反射是Java非常重要的内容,Java反射的实际应用也非常广泛,下面我就全面来详解Java反射@mikechen

Java反射定义

Java反射是指在运行时动态获取一个类的信息并操作它,而无需在编译时确定类的名称和方法等信息。

这样通过Java反射就可以做在运行时获取类的完整构造,并获得类信息了,比如:属性、方法和构造函数等信息。

Java反射详解(万字图文全面总结)-mikechen

 

Java反射作用

Java反射有以下几个作用:

1.动态创建对象

通过Java反射机制,可以在运行时动态地创建类的对象,这为框架的开发、插件化等提供了可能性。

2.动态代理

Java反射机制可以实现动态代理,动态地生成代理对象,这在框架开发、AOP等方面都有应用。

3.动态获取类信息

Java反射机制可以在运行时获取类的属性、方法和构造函数等信息,而无需在编译时知道类的确切类型。

4.修改私有属性

Java反射机制可以在运行时访问类的私有属性,并进行修改,这对于测试和调试等场景非常有用。

 

Java反射使用

1.获取Class对象

Java反射的第一步是获取要操作的类的Class对象。

Java反射详解(万字图文全面总结)-mikechen

在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();

更加详细成员变量获取参考如下:

Java反射详解(万字图文全面总结)-mikechen

 

3.获得构造函数

Java反射可以通过Constructor类获取类的构造函数信息,如下所示:

//mikechen的互联网架构 
Constructor[] constructors = cls.getDeclaredConstructors();

更加详细构造函数获取参考如下:

Java反射详解(万字图文全面总结)-mikechen

 

4.获取类的方法信息

Java反射可以通过Method类获取类的方法信息,如下所示:

// 获取Person类的所有方法
Class<?> clazz = Person.class;
Method[] methods = clazz.getDeclaredMethods();

Method类用于描述类的方法,包括方法名称、返回值类型、参数类型、访问修饰符等信息。

Java反射详解(万字图文全面总结)-mikechen

 

Java反射原理

Java反射机制的核心原理是使用Class对象来获取并操作类的属性、方法和构造函数等信息。

Java反射原理的整个过程,主要分为如下的5大步骤:

1.java文件被编译成class文件

当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。

如下图所示:

Java反射详解(万字图文全面总结)-mikechen

 

2.加载类

加载类:在Java程序运行时,JVM会将所有类加载到内存中,并为每个类创建一个Class对象。

如下图所示:

Java反射详解(万字图文全面总结)-mikechen

Class对象是Java反射的核心,它包含了该类的所有信息,包括:构造函数、方法、属性等信息。

 

3.获取Class对象

程序需要使用Java反射机制时,它首先需要获取要操作的类的Class对象。

如下所示:

// 获取Class对象 
Class<?> clazz = Class.forName("com.mikechen.MyClass");

除了使用上面的Class.forName()方法,还可以使用对象.getClass()方法,或者类字面常量.class获取Class对象

 

4.获取类的属性、方法和构造函数等信息

通过Class对象可以获取类的属性、方法和构造函数等信息,如下图所示:

Java反射详解(万字图文全面总结)-mikechen

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年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法