厚积薄发打卡Day24 :狂神说Java之注解与反射<全网最全(代码+笔记)>
发布日期:2021-04-30 21:03:57
浏览次数:97
分类:精选文章
本文共 3120 字,大约阅读时间需要 10 分钟。
Java注解与反射机制深入理解
一、注解(Annotation)概述
1. 注解的定义与作用
注解是从JDK 5.0开始引入的元数据技术,允许在代码中添加额外的信息。与注释不同,注解可以被程序处理,例如编译器、反射机制等。注解的主要作用包括:
- 元数据存储:提供关于代码元素(如类、方法、字段)的信息。
- 编译器支持:帮助编译器处理特定情况,如重写方法、抑制警告等。
- 运行时处理:通过反射机制,允许程序在运行时访问注解信息。
2. 注解的格式与使用
注解格式为@AnnotationName,其中AnnotationName是注解的名称。注解可以附加在package、class、method、field等元素上。注解还可以带有参数,例如:
@SuppressWarnings(value = "unchecked")
3. 内置注解与元注解
- 内置注解:如
@Override、@Deprecated、@SuppressWarnings,用于标记方法重写、不推荐使用的元素以及抑制编译警告。 - 元注解:用于定义其他注解,Java提供了四个标准元注解:
@Target、@Retention、@Documented、@Inherited,用于描述注解的使用范围、存储级别、是否生成Javadoc和是否可继承。
二、自定义注解
1. 定义方式
自定义注解通过@interface声明,格式为:
public@interface MyAnnotation { String name(); int age() default 0;} 默认值可以通过default关键字定义,参数名默认为value。
2. 应用示例
@MyAnnotation(name = "wayne", age = 001)public void testAnno() {} 三、反射机制概述
1. 反射的作用
反射机制允许程序在运行时获取和操作对象的内部结构,主要功能包括:
- 获取类信息:如父类、接口、构造器、字段、方法。
- 动态创建对象:通过
Class类的newInstance方法。 - 调用方法和操作属性:通过
Method和Field类。 - 处理注解:通过
Annotation类。
2. 获取反射对象
- 已知类:通过
Class.forName("类名")获取。 - 已知实例:通过
obj.getClass()获取。 - 已知字节码:通过
Class.forName("类名")获取。
3. 类信息获取
通过Class类获取类信息:
getName():获取类名。getSuperclass():获取父类。getInterfaces():获取接口。getDeclaredConstructor():获取指定构造器。getMethod():获取指定方法。
四、反射操作
1. 动态创建对象
通过反射创建对象并调用方法:
Class userClass = Class.forName("User");User user = (User) userClass.newInstance(); 2. 调用方法
通过反射调用方法:
Method setName = userClass.getMethod("setName", String.class);setName.invoke(user, "wayne"); 3. 操作属性
通过反射操作属性:
Field nameField = userClass.getDeclaredField("name");nameField.setAccessible(true);nameField.set(user, "wayne"); 4. 处理注解
通过反射获取注解信息:
Annotation annotation = userClass.getAnnotation(TableWayne.class);
五、性能优化
反射操作可能影响性能,特别是在频繁调用反射方法时。可以通过setAccessible(true)提高性能,但需谨慎使用。
六、泛型信息获取
通过反射获取泛型信息,使用ParameterizedType、GenericArrayType等类型:
Type parameterizedType = method.getGenericParameterTypes()[0];if (parameterizedType instanceof ParameterizedType) { Type[] actualTypeArgs = ((ParameterizedType) parameterizedType).getActualTypeArguments(); System.out.println(Arrays.toString(actualTypeArgs));} 七、反射应用实例
1. ORM框架原理
通过反射获取表结构信息和字段信息:
Class studentClass = Class.forName("Student2");Annotation tableAnnotation = studentClass.getAnnotation(TableWayne.class);String tableName = tableAnnotation.toString().split("\\.")[3].substring(0, tableName.indexOf('('));System.out.println("表名:" + tableName);Field nameField = studentClass.getDeclaredField("name");Annotation fieldAnnotation = nameField.getAnnotation(FieldWayne.class);String columnName = fieldAnnotation.toString().substring(fieldAnnotation.toString().lastIndexOf('.') + 1, fieldAnnotation.toString().indexOf('('));System.out.println("字段名:" + columnName); 2. 动态代理
通过反射动态生成代理类,实现日志记录:
ProxyGenerator generator = new ProxyGenerator();Class[] interfaces = new Class[] {Loggable.class};ProxyClass pc = generator.generateProxyClass(interfaces, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("执行方法:" + method.getName()); return method.invoke(target, args); }}); 八、总结
注解和反射机制是Java中的核心概念,注解用于元数据标记,反射机制用于动态操作元信息。通过理解和实践这些技术,可以显著提升Java开发能力,特别是在动态代理、ORM框架和框架开发中。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2026年06月22日 03时51分41秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP引擎php.ini参数优化
2023-03-01
PHP引用(&)使用详解
2023-03-01
php引用及垃圾回收
2023-03-01
php当前时间的集中写法
2023-03-01
php微信 开发笔记,微信WebApp开发总结笔记
2023-03-01
php微信公众号开发access_token获取
2023-03-01
php微信公众号开发微信认证开发者
2023-03-01
php微信公众号开发用户基本信息
2023-03-01
php怎么将对象变成数组,php怎么将对象转换成数组
2023-03-01
RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列
2023-03-01
php怎样比较两数大小,jquery如何判断两个数值的大小
2023-03-01
PHP性能监控 - 开启xhprof(一)
2023-03-01
PHP性能监控 - 怎么看xhprof报告(二)
2023-03-01
php截取字符串代码,PHP字符串截取_php
2023-03-01
php截取字符串,无乱码
2023-03-01
php手冊,php手冊之變量范圍
2023-03-01
PHP手机号码归属地查询API接口
2023-03-01
PHP执行耗时脚本实时输出内容
2023-03-01
PHP扩展安装
2023-03-01