注解和反射

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);
posted on 2022-08-28 22:20  热爱技术的小郑  阅读(16)  评论(0编辑  收藏  举报