一、Java 反射
1. 反射是什么?
反射对于 Java 程序员来说算是一种高级的特性了,像类的热加载、动态代理等都是通过反射来实现的。基本上对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
2. 注解作用
简单一点说,Class 类可以看做是所有类的元数据类(JDK 对此类的解释为 Class 类代表了正在运行的 Java 程序中的类和接口),而我们又知道方法区是用来存放已经被加载的类的信息、常量、字段、方法等信息,所以说给人最直观的一个感受就是 Class 类可以间接的与方法区对应起来,具体是如何对应以及是如何操作的,感兴趣的小伙伴可以自行研究。
3. 反射的简单使用
public class TestReflect {
private String nameTest;
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
TestReflect testReflect=new TestReflect();
System.out.println(testReflect.getClass().getName());
//获取属性
Field[] fields = testReflect.getClass().getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
}
}
输出结果:
xmht.reflect.TestReflect
nameTest
还有好多,比如可以获取类的所有方法,对象的所有属性等等,期待你的挖掘。
二、Java 注解
1. 注解是什么?
其实 Java 的注解还是特别常见的,像平时用到的 @Override、@Deprecated 等都是注解的一种表现方式。
对于注解官方解释:为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便地使用这些数据。
2. 注解作用
可以书写更加干净易读的代码,简化重复的工作,比如 Spring 的注解;
另外还提供编译期类型检查,比如 @Override 当方法签名对不上覆盖的方法时,编译器就会发出错误提示:
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
3. 注解分类
注解名字
注解类型
注解作用
@Override
标准注解
表示当前的方法覆盖自父类方法。如果不小心拼写错误或者方法签名对不上,编译器就会报错
@Deprecated
标准注解
表示此方法已经失效,将在未来版本中删除
@SuppressWarnings
标准注解
关闭编译器的警告信息
@Target
元注解
表示该注解用于什么地方。CONSTRUCTOR:构造器声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类)或者enum声明
@Retention
元注解
表示需要在什么级别保存该注解信息。SOURCE:注解将被编译器丢弃 CLASS:注解在class