注解与反射
注解与反射
01 注解学习
1 | 注解是一种代码级别的说明,注释和注解一个最大的区别就是,当你代码哪里写错了,注解会报错 |
- 我们以前常用的一个注解,@Override 指的是重写
001 内置注解
1 | @Override 指的是重写 |
002 元注解
001 @Retention
- 翻译是保留的意思,这个注解的意思其实就是在什么阶段去保留
- @Retention(RetentionPolicy.RUNTIME) 的作用是确保注解在运行时可用,基本上使用这个
- @Retention(RetentionPolicy.SOURCE) 的作用是在源码时保留
- @Retention(RetentionPolicy.CLASS) 的作用是在CLASS时可用
002 @Target
- 这个的意思是指作用域在哪里
- @Target(ElementType.METHOD) 作用在方法上
- @Target(ElementType.TYPE) 作用在类型上
- @Target(ElementType.LOCA_VARIABLE) 作用在变量上
- 就可以让这个注解去注解别人
- 可以像这样多放:@Target(value= {ElementType.METHOD,ElementType.TYPE})
003 @Documented
表示是否将我们的注解生成在Javadoc中
004 @Inherited
子类可以继承父类的注解
003 自定义注解
eg:
1 | public class test02 { |
用value的话上面可以省略value:
1 | public class test02 { |
02 反射学习
001 通过反射获取类的class对象
实体类:pojo,entity
- 一个类在内存中只有一个Class对象
- 一个类被加载后,类的整个结构都会被封装在Class对象中
1 | // forname获得 |
002 class类常用方法
03 获得类的信息
001 获取包名+类名 或 类名
- 具体代码
1 | System.out.println(cl.getName()); |
可以像这样来查询不知道的包名
1 | User user=new User(); |
002 获取类的属性
- Field[] fields = cl.getFields();只能找到public属性
1 | Field[] fields = cl.getFields(); |
- fields = cl.getDeclaredFields();能找到全部属性
1 | fields = cl.getDeclaredFields(); |
这两者里面加上具体内容如 fields = cl.getDeclaredFields(name);
获取指定属性的值
003 获得类的方法
- Method[] methods=cl.getMethods(); 获得本类和父类的public方法
1 | Method[] methods=cl.getMethods(); |
- methods=cl.getDeclaredMethods(); 获得本类所有方法
1 | methods=cl.getDeclaredMethods(); |
- 获得指定方法
1 | Method getName = cl.getMethod("getName", null); |
004 获取类的构造方法
获取public构造方法
1
2
3
4Constructor[] constructors = cl.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}获取构造方法
1
2
3
4Constructor[] constructors = cl.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}获得指定方法
1
Constructor constructor = cl.getDeclaredConstructor(String.class,int.class);
005 动态创建对象
(1) 无参/有参创建对象
- 这两者的输出是相等的
1 | //获得class对象 |
有参则需要通过构造器创建对象
1
2
3
4//获得构造器
Constructor<?> declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
User user2 = (User) declaredConstructor.newInstance("cl", 1);
System.out.println(user2);输出
1
User{name = cl, age = 1}
(2) 通过反射调用普通方法
1 | //构造一个对象 |
(3) 通过反射操作属性
- 我们这样用他是会报错的,因为私有属性不让被set
1 | Field name = c1.getDeclaredField("name"); |
因此我们需要用name.setAccessible(true);来关闭程序的安全检测
1
2name.setAccessible(true);
name.set(user,"cll");
04 注解和反射
- 建立两个注解,一个是类名的注解,另一个是属性的注解
把我们的类名和属性加上注解
创建类的class对象,通过反射获取类名的注解
获得指定类名的value值
获得指定属性的注解

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ᕙ(• ॒ ູ•)ᕘ欢迎光临ᕙ(`▿´)ᕗ!




