Java 注解和反射总结

本文整理自狂神视频【狂神说Java】注解和反射

注解

内置注解

@Override 表示一个方法声明打算重写父类中的另一个方法声明
@Deprecated 表示不鼓励程序员使用该元素,通常因为他们很危险或者存在更好的选择
@SuppressWarnings 抑制编译警告

元注解

元注解:负责注解其他注解。Java定义了4个标准的meta-annotation。
在包java.lang.annotation中
@Target 描述注解的适用范围
@Retention 描述注解的生命周期 SOURCE<CLASS<RUNTIME
@Documented 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解

反射

反射(Reflection):是Java被视为动态语言的关键。反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
在这里插入图片描述
一个类在内存中只有一个Class对象
一个类被加载后,类的整个结构都会被封装在Class对象中

Class类:

  • Class类本身也是一个类
  • Class对象只能由系统建立对象
  • 一个加载的类在JVM中只会有一个Class实例
  • 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • 每个类的实例都会记得自己由哪个Class实例所生成
  • 通过Class可以完整的得到一个类中所有被加载的结构

获得Class类的方式:

package com.example.reflection;

public class reflection {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();

        //方式一:通过对象获得
        Class c1 = person.getClass();
        System.out.println(c1.hashCode());

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

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

        //方式四:基本内置类型的包装类有一个TYPE属性
        Class c4 = Integer.TYPE;

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

    }
}

class Person{
    protected String name;
}

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

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

在这里插入图片描述
在这里插入图片描述

反射工具使用

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅
hutool

使用hutool里反射工具进行赋值和取值

定义一个枚举,枚举的其中一个值是另一个类中的变量名。

package com.example.reflection;

import lombok.Getter;

@Getter
public enum Permission {
    EAT(0,"eat"),
    PLAY(1,"play"),
    SLEEP(2,"sleep"),
    ;
    private Integer code;
    private String msg;
    Permission(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

普通实体类:

package com.example.reflection;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonPermission {
    private Boolean eat;
    private Boolean play;
    private Boolean sleep;
}

测试类:

import cn.hutool.core.util.ReflectUtil;
import com.example.reflection.Permission;
import com.example.reflection.PersonPermission;

public class TestdemoApplication {
    public static void main(String[] args) throws NoSuchFieldException {
        PersonPermission personPermission = PersonPermission.builder()
                .eat(false)
                .play(false)
                .sleep(false)
                .build();
        System.out.println(personPermission);
        Permission[] values = Permission.values();
        for (Permission p:values
             ) {
            //通过反射赋值
            ReflectUtil.setFieldValue(personPermission,p.getMsg(),true);
        }
        System.out.println(personPermission);
        for (Permission p:values
        ) {
            //通过反射取值
            Boolean res = (Boolean)ReflectUtil.getFieldValue(personPermission,p.getMsg());
            System.out.println(p.getMsg() + " " + res);
        }
    }
}

输出如下:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值