1、什么是注解
1、Annotation的作用
- 不是程序本身可以对程序做出解释
- 可以被其他程序读取
2、格式
@注释名,还可以添加一些参数
3、使用
package、class、method、field等上边,添加辅助信息,通过反射机制来访问这些元数据
2、内置注解
- @Override:只适用修饰方法、表示一个方法声明打算重写超类中的另一个方法声明。
- @Deprecated:修饰方法、属性、类,表示不鼓励程序员使用这样的元素,通常是它很危险或者存在更好的选择(已经过时的)
- SuppressWarnings:用来压制编译时的警告信息(可以放在类的上方,镇压所有的警告信息All)
3、元注解
作用:注解其他注解的注解
- @Target:用于描述注解的范围
- @Retention:表示需要在什么级别保存该注解信息,用于描述注解的生命周期
- @Document:说明该注解将被包含在javadoc中
- @Inherited:说明子类可以继承父类中的该注解
4、自定义注解
5、反射概述
Reflection(反射)是java被视为动态语言的关键,反射机制允许程序在执行期借助与Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性以及方法。
功能:
- 1、在运行时判断对象属于哪个类
- 2、在运行时构造一个类的对象
- 3、在运行时判断一个类所具有的成员变量和方法
- 4、在运行时获取泛型信息
- 5、在运行时调用一个对象的成员方法和变量
- 6、生成动态代理…
优点:
实现动态创建对象和编译,灵活
缺点:
影响性能(反射基本上也是一种解释操作)
6、得到Class类的几种方式
- 1、已知具体的类,通过类的class属性。【Class c=Student.class;】
- 2、已知某个类的实例(对象),调用该实例的getClass方法获取Class对象【Class c=student.getClass();】
- 3、通过路径。forName()方法获取【Class c=Class.forName(“com.zheng.demo.Student”);】
7、所有类型的Class对象
- 外部类、匿名内部类、静态内部类、成员内部类、局部内部类
- 接口
- 数组
- 枚举
- 注解
- 基本数据类型
8、类加载内存分析、分析类初始化、类加载器
JVM:https://blog.csdn.net/weixin_43304253/article/details/119609324
9、获取类的运行时结构
public class MyTest {
public static void main(String[] args) {
Student student = new Student();
Class c = student.getClass();
System.out.println(c.getName());//获得包名+类名
System.out.println(c.getSimpleName());//获取类名
//获取public属性
System.out.println("==============");
Field[] fields = c.getFields();
for (Field field : fields) {
System.out.println(field);
}
//获取私有属性
Field[] declaredFields = c.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("=============");
//获取public方法
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
10、动态创建对象执行方法
创建类的对象:调用Class对象的newInstance()方法
- 1、类必须有无参构造
- 2、类的构造器的访问权限需要足够
Class c= Student.class;
Student student = (Student) c.newInstance();
System.out.println(student.address);
//通过反射操作方法 invoke激活(对象,方法的值)
Method setName = c.getDeclaredMethod("setName", String.class);
setName.invoke(student,"小明");
System.out.println(student.getName());
Method setAge = c.getDeclaredMethod("setAge", int.class);
setAge.invoke(student,18);
System.out.println(student.getAge());
通过构造器
//通过构造器
Class c = Student.class;
Constructor con = c.getDeclaredConstructor(String.class, int.class);
Student stu1 = (Student) con.newInstance("小青", 18);
stu1.setName("小红红");
System.out.println(stu1.getName());
System.out.println(stu1);