不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Java基础

  • 面向对象

  • Java进阶

    • 01.文件处理
    • 02.异常处理
    • 03.反射
    • 04.注解
      • 01.注解
        • 1、注解作用
        • 2、代码演示
    • 05.泛型
    • 06.日期与时间
    • 07.多线程基础
    • 08.多线程进阶
    • 10.设计模式
  • Web基础

  • Spring框架

  • 微服务

  • Java
  • Java进阶
xiaonaiqiang
2024-04-16
目录

04.注解

# 01.注解

# 1、注解作用

  • Java注解提供了一种安全的方法来揭示程序的某些方面,而不会直接影响到代码本身
  • 它可以被用来生成代码,编译时工具和运行时工具可以获取到这些信息

和Python装饰器不同点

  • 实现原理不同

    • Java的注解是在编译时生成的,它们是Java源代码的一部分,可以通过反射机制在运行时被读取
    • Python的装饰器是在运行时动态添加的,它们是Python的一种语法糖,可以在定义函数或类的时候立即执行
  • 使用方式不同

    • Java的注解需要通过反射机制来使用
    • 而Python的装饰器可以直接作用于函数或类,更加直观和简洁
  • 功能范围不同

    • Python的装饰器功能更加强大,它不仅可以修改被装饰对象的行为,还可以替换被装饰对象
    • 而Java的注解主要用于添加元数据,但不能替换被注解的对象

# 2、代码演示

  • Java 的注解本质上只是一种元数据标记,它本身并不会改变代码的执行逻辑

  • 要实现注解的功能,还需要一个解析器来解析这些注解,并基于注解的信息来改变代码的执行逻辑

  • PermissionChecker.checkPermission(user, "admin")这行代码就是一个解析器

  • 它读取 User 对象的 deleteUser 方法的 @Permission 注解,并检查当前角色是否有权限执行该方法

package cls;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

class User {
    @Permission(role = "admin")  // 标注只有 role=admin 的角色才能调用
    public void deleteUser() {
        // 删除用户
    }
}

@Retention(RetentionPolicy.RUNTIME)  // 指定在运行时可以通过反射获取注解信息
@Target(ElementType.METHOD)  // 指定注解可以标注在方法上
@interface Permission {
    String role();  // 定义了注解 Permission 的一个属性 role,类型为 String
}

class PermissionChecker {  // 定义一个权限校验器
    // 检查对象中的所有方法是否需要的权限角色传入的是否匹配
    public static void checkPermission(Object obj, String role) {
        // 通过反射获取对象中所有的方法
        Method[] methods = obj.getClass().getDeclaredMethods();
        for (Method method : methods) {
            // 判断哪些方法被 @Permission 注解标注
            if (method.isAnnotationPresent(Permission.class)) {
                // 获取注解的角色信息
                Permission permission = method.getAnnotation(Permission.class);
                // 与传入的角色信息比较
                if (!permission.role().equals(role)) {
                    throw new RuntimeException("No permission!");
                } else {
                    System.out.println("permission success");
                }
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        User user = new User();
        // 要实现注解的功能,需要一个解析器来解析这些注解,并基于注解的信息来改变代码的执行逻辑
        PermissionChecker.checkPermission(user, "admin2");
        user.deleteUser();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
上次更新: 2024/5/31 11:18:42
03.反射
05.泛型

← 03.反射 05.泛型→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式