活动地址:CSDN21天学习挑战赛
🌻今天进行注解、反射的学习
Java基础的课程大部分已经结束,剩下一些小的点进行补充
注解:Annotation JDK1.5
public @interface MyAnnotation(){
}
自创注解
注解也有注解,元注解:专门给注解加的注解

Retention等都是枚举,后面跟的是常量
我们发现注解中可以有方法,可以有默认值
String name() default “Tom”;
定义方法格式:String name(); 不写默认值需要赋值,有默认值用default指定默认值
public class Ch01{
@MyAnnotation(age=20) 可以理解为加了返回值
public void show(){
}
}
如果只有一个可以不用写名字,如果有多个需要写名字
在java的整个的注解体系中,有三个非常重要的主干类
1.Annotation 接口 定义一些常用的方法
2.ElementType枚举 用来指定注解的类型 (注解要用在哪里)
3.RetentionPolicy 枚举 用来指定注解的策略,不同类型的策略指定的作用域不同
(1)SUTCE 注解仅存在与编译器处理期间,编译期处理完之后,这个注解就没有了
(2)CLASS 注解在.class文件中依然有效
(3)RUNTIME 编译期是不起作用的,只有在运行期才由JVM读取
Java自带注解
1.@Override,检测方法是否是重写方法,如果返现其父类,或者引用的接口中没有该方法会报错
2.@Deprecated 标记的方法是过时的方法
3.@SuppressWarnings 让编辑器去忽略警告
4.@SafeVarargs 忽略任何使用参数为泛型变量的方法或构造器产生的警告
5.@FunctionalInterface 标识一个接口为函数式接口
6.@Repeatable 标识某个注解可以在同一个声明上使用多次
all:忽略所有警告
boxing:忽略装箱拆箱警告
rawtypes:使用生成时没有指定数据类型
unchecked:忽略没有进行类型检测的警告
unused:忽略没有使用的警告

1.@Retention 标识这个注解的作用域
2.@Documented 标记这个注解是否包含在用户文档中
3.@Target 这个注解可以修饰哪些信息
4.@Inherited 如果一个类用上了这个注解 ,那么其子类也会继承这个注解
Class类
可以拿到类里面的所有结构,不需要操作这个类就可以访问类的信息
1.直接使用类名.class

2.使用全类名

3.使用对象

Class<>泛型使用时候加上
获取类的名字:clazz.getName()
获取类的加载器:
获取资源
URL resource = clazz.getResource(“”);
获取父类
clazz.getSuperclass()
是不是接口数组
clazz.isArray();
clazz.isInterface();
重点
Dog dog = clazz.newInstance(); jdk9过时
创建出dog一个对象:使用class类对象实例化一个对象
clazz.getDeclaredConstructor().newInstance(); 代替 用构造器的写法
对成员变量的操作:

对成员变量进行操作,只能获取到public修饰的属性

可以获取到private属性

可以拿到所有的属性

获取对象的属性

String str = (String)type.get(dog1); 如果想要字符串就用强转
给对象的属性赋值

私有化的东西也可以操作

反射调用方法???
通过反射来调用构造器

通过构造器创建对象

构造器私有化

sout(dog1.getName());
对注解的操作

反射与注解虽然难度不如多线程等版块,但是重要性不容忽视,对于对象的创建我们鼓励利用反射来创建,它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。
业精于勤,荒于嬉; 行成于思,毁于随。