无名商城论坛

搜索
查看: 1198|回复: 0

[TSD/原创] 【解忧】深入理解Java反射

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 20:37:07 | 显示全部楼层 |阅读模式

当我们在 IDE 中编写代码的时候,打一个点号,IDE 会自动弹出对应的属性和方法名。当我们在 debug 的时候,IDE 会将方法运行时方法内局部变量和外部实例上属性的值都展示出来,spring 中的 IOC 和 AOP,以及一个 RPC 框架中,我们反序列化,consumer 的代理,以及 provider 的调用都会用到 Java 的反射功能,有人说使用反射会慢,那么到底慢在哪里呢?

反射

反射使 Java 语言有了动态编译的功能,也就是在我们编码的时候不需要知道对象的具体类型,但是在运行期可以通过 Class.forName() 获取一个类的 class 对象,在通过newInstance 获取实例。

先看下 java.lang.reflect 包下的几个主要类的关系图,当然动态代理的工具类也在该包下。
AnnotatedElement

作为顶级接口,这个接口提供了获取注解相关的功能,我们在方法,类,属性,构造方法上都可以加注解,所以下面的 Field,Method,Constructor 都有实现这个接口,以下是我们经常用的两个方法,jdk8 以后接口里面可以通过 default 修饰方法实现了。

1Annotation[] getAnnotations(); //获取目标对象(方法和属性)上的所有注解
2default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) {
3     Objects.requireNonNull(annotationClass);
4     // Loop over all directly-present annotations looking for a matching one
5     for (Annotation annotation : getDeclaredAnnotations()) {
6         if (annotationClass.equals(annotation.annotationType())) {
7             // More robust to do a dynamic cast at runtime instead
8             // of compile-time only.
9             return annotationClass.cast(annotation);
10         }
11     }
12     return null;
13 }

GenericDeclaration

提供了获取泛型相关的功能,只有方法和构造方法上支持泛型,所以只有 Method,Constructor 实现了该接口


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表