首页 > 其他分享 >注解反射详解

注解反射详解

时间:2024-08-17 12:57:49浏览次数:10  
标签:反射 class System public 详解 println 注解 Class out

注解反射

注解

1.注解概述

//什么是注解
public class Test01 extends Object{
    //@Override  重写的注解
    @Override
    public String toString() {
        return super.toString();
    }
}

2.内置注解

//什么是注解
@SuppressWarnings("all")//镇压警告
public class Test01 extends Object{
    //@Override  重写的注解
    @Override
    public String toString() {
        return super.toString();
    }
    //@Deprecated  不推荐程序员使用,但是可以使用,或者存在更好的方式
    @Deprecated
    public static void test(){
        System.out.println("Deprecated");
    }
    @SuppressWarnings("all")//镇压警告
    public void test02(){
        List list = new ArrayList();
    }

    public static void main(String[] args) {
        test();
    }
}

3.元注解

//测试元注解
@MyAnnotation
public class Test02 {
    @MyAnnotation
    public void test(){

    }

}
//定义一个注解
//Target 表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})

//Retention表示注解在什么地方还有效
//runtime>class>sources
@Retention(value = RetentionPolicy.RUNTIME)

//Documented  表示是否将我们的注解生成在JAVAdoc中
@Documented

//Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation{

}

4.自定义注解

//自定义注解
public class Test03 {
    //注解可以显示赋值,如果没有默认值,我们就必须给注解赋值
    @MyAnnotation2(age = 18,name = "小柒")
    public void test(){}
    
    @MyAnnotation3("111")
    public void test1(){
        
    }

}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //注解的参数:参数类型+参数名();
    String name() default "";
    int age();
    int id() default -1;//如果默认值是-1,代表不存在
    String[] schools() default {"清华大学"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    String value();
}

反射

1.反射概述

2.获得反射对象

//什么叫反射
public class Test01 extends Object{
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获取类的Class对象
        Class c1 = Class.forName("com.Reflect.User");
        System.out.println(c1);

        Class c2 = Class.forName("com.Reflect.User");
        Class c3 = Class.forName("com.Reflect.User");
        Class c4 = Class.forName("com.Reflect.User");
        //一个类在内存中只有一个Class对象
        //一个类被加载后,类的整个结构都会被封装在Class对象中
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }

}
//实体类:pijo entity
class User{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private int id;
    private int age;

    public User() {
    }

    public User(String name, int id, int age) {
        this.name = name;
        this.id = id;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}

3.得到Class类的几种方式

//测试Class类的创建方式有哪些
public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        System.out.println("这个人是"+person.name);
        //方式一: 通过对象获得
        Class c1 = person.getClass();
        System.out.println(c1.hashCode());

        //方式二:forname获得
        Class c2 = Class.forName("com.Reflect.Student");
        System.out.println(c2.hashCode());

        //方式三:通过类名.class获得
        Class c3 = Student.class;
        System.out.println(c3.hashCode());

        //方式四:基本内置类型的包装类都有一个Type属性
        Class c4 = Integer.TYPE;
        System.out.println(c4);

        //获得父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);


    }
}

class Person{
    public String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

class Student extends Person{
    public Student(){
        this.name="学生";
    }
}
class Teacher extends Person{
    public Teacher(){
        this.name="老师";
    }
}

4.所有类型的Class对象

//所有类型的Class
public class Test03 {
    public static void main(String[] args) {
        Class c1 = Object.class;//类
        Class c2 = Comparable.class;//接口
        Class c3 = String[].class;//一维数组
        Class c4 = int[][].class;//二维数组
        Class c5 = Override.class;//注解
        Class c6 = ElementType.class;//枚举
        Class c7 = Integer.class;//基本数据类型
        Class c8 = void.class;//void
        Class c9 = Class.class;//Class

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);
        System.out.println(c9);

        //只要元素类型与维度一样,就是同一个Class
        int[] a = new int[10];
        int[] b = new int[100];
        System.out.println(a.getClass().hashCode());
        System.out.println(b.getClass().hashCode());
    }
}

5.类加载内存分析

public class Test04 {
    public static void main(String[] args) {
        A a= new A();
        System.out.println(A.m);
        /*
        1.加载到内存,会产生一个类对应Class对象
        2.链接,链接结束后 m =0
        3.初始化
             <clinit>(){
                   System.out.println("A类静态代码块初始化");
                   m=300;
                   m=100;
             }
             m=100;
             */
    }
}

class A{
    static {
        System.out.println("A类静态代码块初始化");
        m=300;
    }
    /*
    m=300
    m=100
    */
    static int m = 100;
    public A(){
        System.out.println("A类的无参构造初始化");
    }
}

标签:反射,class,System,public,详解,println,注解,Class,out
From: https://blog.csdn.net/m0_63783672/article/details/141279014

相关文章

  • Winform C#多显示器窗口控制详解
    写Winform程序的时候,有将一个窗口放置到特定的显示器,并且全屏的需求。于是借此机会,好好研究了一番这个Screen类[1],总结了一些方法。Windows的窗口逻辑首先我们需要知道窗口定位的逻辑。以2个窗口为例,下面的图片展示了显示器和坐标的对应关系。注意,使用深色模式可能看不清,可以点......
  • Git 高级用法详解
    文章目录Git高级用法详解标签管理1.1创建标签1.2查看标签1.3推送标签变基操作(Rebase)2.1变基的基本操作2.2处理变基时的冲突2.3交互变基解决冲突3.1合并冲突3.2变基冲突撤销更改4.1撤销未提交的更改4.2撤回已提交的更改4.3重置分支与远程仓库交互5.1添加......
  • C++编程:内存栅栏(Memory Barrier)详解及在多线程编程中的应用
    文章目录0.引言1.什么是内存栅栏?2.为什么需要内存栅栏?本质原因是什么?2.1编译器优化2.2CPU乱序执行3.ARM64和x86架构下的内存栅栏差异3.1x86架构3.2ARM64架构4.代码示例4.1代码解析4.2memory_order_release和memory_order_acquire解释4.3为什么是“releas......
  • 操作符详解(二)
    目录1.逗号表达式2.下标访问[]、函数调用()1) []下标引用操作符2) 函数调用操作符3.结构成员访问操作符1)结构体2)结构的声明3)结构体变量的定义和初始化4)结构体成员的直接访问5)结构体成员的间接访问4.操作符的属性:优先级、结合性1)优先级2)结合性5. 表达......
  • Java反射机制快速入门与通配符
    1.Java反射的原理​在Java中,每个类在编译后都会生成一个.class文件,JVM会为每个加载的类创建一个Class对象,这个对象包含了类的全部结构信息,包括类名、方法、字段、构造函数等。Class对象存储了类的元数据,这些元数据可以在运行时被访问。通过Class对象,程序可以......
  • 快速排序算法详解及Python实现
    目录引言快速排序算法步骤快速排序的Python实现性能分析注意事项引言快速排序(QuickSort)是一种高效的排序算法,由C.A.R.Hoare在1960年提出。它的基本思想是:通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此......
  • 用户主组与附加组权限累加问题详解
    用户主组与附加组权限累加问题详解先看结论:结论:用户主组与附加组的权限关系为累加关系,当用户尝试访问文件或目录时,系统会按以下顺序检查权限:检查文件属主的权限:如果用户是文件的属主,系统使用属主权限进行判断。检查用户的所有组的权限:如果用户不是文件的属主,但用户属于......
  • 详解堆排序(内附代码实现)
    堆排序有两个过程下标为i的节点的父节点下标:(i-1)/2整除下标为i的节点的左孩子下标:i*2+1下标为i的节点的右孩子下标:i*2+2待排序序列为:​ 23814910716141.建大顶堆​ 首先建立无序堆 然后建立大顶堆:从右往左,从下往上,递归的选择子节点最大的往上浮首先14大......
  • 关于sizeof()与strlen()的详解与题例
    ......
  • InstructGPT: Training language models to follow instructions with human feedback
    文章目录1.InstructGPT目标2.数据集2.1SFT数据集2.2RM数据集2.3PPO数据集3.训练细节3.1SFT训练3.2RM训练3.3RLHF训练4.结论1.InstructGPT目标InstructGPT探讨了如何通过人类反馈来训练语言模型以更好地遵循用户的意图。通过对模型进行监督学习和强化......