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
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