厚积薄发打卡Day24 :狂神说Java之注解与反射<全网最全(代码+笔记)>
发布日期:2021-04-30 21:03:57 浏览次数:97 分类:精选文章

本文共 3120 字,大约阅读时间需要 10 分钟。

Java注解与反射机制深入理解

一、注解(Annotation)概述

1. 注解的定义与作用

注解是从JDK 5.0开始引入的元数据技术,允许在代码中添加额外的信息。与注释不同,注解可以被程序处理,例如编译器、反射机制等。注解的主要作用包括:

  • 元数据存储:提供关于代码元素(如类、方法、字段)的信息。
  • 编译器支持:帮助编译器处理特定情况,如重写方法、抑制警告等。
  • 运行时处理:通过反射机制,允许程序在运行时访问注解信息。

2. 注解的格式与使用

注解格式为@AnnotationName,其中AnnotationName是注解的名称。注解可以附加在packageclassmethodfield等元素上。注解还可以带有参数,例如:

@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方法。
  • 调用方法和操作属性:通过MethodField类。
  • 处理注解:通过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)提高性能,但需谨慎使用。

六、泛型信息获取

通过反射获取泛型信息,使用ParameterizedTypeGenericArrayType等类型:

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框架和框架开发中。

上一篇:String类
下一篇:JavaWeb学习笔记(15)__DOM

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2026年06月22日 03时51分41秒