作用:注解是附加在代码中的一些信息,用于编译、运行时解析和使用,起到说明配置作用
主要学习两方面1 元注解,2 自定义注解
一、元注解
包括:1.@Target, 2.@Retention 3.@Documented, 4.@Inherited 几种
1 @Target
作用:用于描述注解的使用范围(即 注解是描述:包、类、字段、方法、参数、接口等)
取值:1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Target(ElementType.TYPE) //注解用于描述类的
public @interface Table {
/**
* 数据表名称注解,默认值为类名称
* @return
*/
public String tableName() default "className";
}
@Target(ElementType.FIELD) //注解用在字段上
public @interface NoDBColumn {
}
2.@Retention
作用:描述注解的生命周期(1 仅存在源码中,不会被编译 2 存在编译器中,不会在运行中取到 3 存在与类运行期,运行时可以通过反射读取)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)//注解可以在运行期通过反射取得
public @interface Column {
public String name() default "fieldName";
}
3.@Documented,
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
4.@Inherited
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类
二、自定义注解
使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口,其中每一个方法声明一个配置参数,方法名称就是参数名称,
返回值就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
例子:两个注解,分别标识实体对应的表和数据库中字段
1 类注解
@Target(value=ElementType.TYPE)//表示该注解用于类上面 @Retention(RetentionPolicy.RUNTIME) //运行时可以通过反射取得 public @interface Table { public String name() default ""; }
2 属性注解,并且注解有两个属性
@Target(value=ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String value() default "";
public boolean isKey() default false;
}
3 实体
package anotation;
@Table(name="s_user")
public class User {
@Column(value="id",isKey=true)
private Integer id;
@Column("s_name") //没有指定注解的name 则默认name为value 等同于 value="s_name"
private String name;
@Column(value="s_age")
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4 测试类,通过反射得到类的各种信息
public class Test { public static void main(String[] args) throws Exception { User user = new User(); user.setId(1); user.setName("wang"); user.setAge(89); // Class<User> userClazz = (Class<User>) Class.forName( "anotation.User"); Class userClazz = user.getClass(); Table table = (Table) userClazz.getAnnotation(Table.class); //得到类的注解 System.out.println("表名称 : "+table.name() ); //取得注解的名称 属性 Field[] fields = userClazz.getDeclaredFields(); //得到所有的 对象的属性 for(int i=0;i<fields.length;i++ ){ Field field = fields[i]; Column column = field.getAnnotation(Column.class );//得到属性上的注解 System.out.println( "column的注解名称:"+column.value()+" 注解:isKey=== "+column.isKey() );//打印属性上的注解 String fieldName = field.getName(); //得到属性名称 Class clazz = field.getType();//得到属性类型 System.out.println(fieldName + " 字段类型 "+clazz ); field.setAccessible(true);//可以访问私有变量 System.out.println( fieldName + " 调用字段变量取得字段值 "+ field.get(user ) );//打印对象的该属性的值 Method method = userClazz.getMethod("get"+toUpperCaseFirstOne(fieldName) );//调用get取得该对象的值 System.out.println( fieldName + " 调用字段get方法取出字段值 "+ method.invoke(user) ); System.out.println("判断字段类型是否为整形:"+( clazz==Integer.class));//判断一个字段的类型 System.out.println( "============"); } // Object name = 1; // System.out.println( name.getClass().equals( Integer.class) ); } /** * 首字母转大写 * @param s * @return */ public static String toUpperCaseFirstOne(String s) { if(Character.isUpperCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString(); } }
相关推荐
现在,我们可以使用反射机制来获取这个注解。Java的`Field`类提供了`getAnnotation(Class<A> annotationClass)` 方法,用于获取指定类型的注解: ```java public class AnnotationReflectionDemo { public static ...
介绍如何利用反射和注解去简单的模拟JUnit4单元测试的使用,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解。需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程。...
通过反射获取注解的属性值 1、获取类上注解的值 1.1 定义注解类 1.2 定义使用注解的类 1.3 测试类 1.4 测试结果 2、获取属性变量上注解的值 2.1 定义注解类 2.2 定义使用注解的类 2.3 定义测试类 2.4 测试结果 3、...
在Java编程中,Spring...总的来说,理解和掌握反射与注解对于深入学习Spring框架至关重要。通过模拟Spring的依赖注入,开发者可以更好地领悟到IoC和DI的核心思想,从而在实际开发中更有效地利用Spring框架提供的功能。
本示例“servlet反射注解例子”旨在帮助我们深入理解如何将这两种技术结合使用,以实现更加灵活和可维护的服务器端应用程序。本文将详细探讨反射和注解在Servlet中的应用。 首先,让我们来了解一下什么是反射。反射...
1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已过时。注解可以应用于类、接口、字段、方法等。注解本身不直接影响程序的执行,但...
1. **注解的创建与使用**:展示如何自定义注解以及如何在代码中使用这些注解。 2. **元注解的运用**:例如`@Retention`、`@Target`等元注解的使用,控制注解的生命周期和作用范围。 3. **注解处理器**:演示如何编写...
这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...
java注解和反射的个人学习笔记
Java自定义注解和通过反射获取...总的来说,理解并熟练掌握Java自定义注解和反射的使用,对于提升Java开发者的编程能力和编写高质量代码具有重要意义。通过深入学习和实践,你可以创造出更加优雅和强大的Java应用程序。
在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...
5. **反射与注解结合使用**: - 在运行时,可以通过反射获取类上的注解,判断是否需要执行特定逻辑。 - 自定义注解处理器可以利用反射来动态地创建对象、调用方法,实现灵活的代码生成和运行时行为控制。 理解并...
反射操作注解与反射操作泛型 在 Java 编程中,反射操作和泛型是两个重要的概念。反射操作是指在运行时检查和修改类、对象、方法、字段等信息的能力,而泛型是指在编译时检查和限制类型的能力。本文将详细介绍反射...
6. **注解与反射**:反射可以读取类、方法、字段上的注解信息,这在运行时动态处理逻辑、实现插件化等方面非常有用。 在`AnnotationDemo-master`这个项目中,可能包含了注解和反射的实践案例,例如通过注解定义接口...
反射注解暴力反射详细思维导图.xmind
本主题探讨的是如何通过反射和注解来自定义ORM框架,以简化数据库操作。以下是关于这个主题的详细知识点: 1. **反射(Reflection)**: Java反射是Java语言的一项高级特性,它允许运行中的Java程序对自身进行检查...
poi导出导入封装(使用注解建立实体与excel映射关系+反射设置实体属性值), poi导出导入封装(使用注解建立实体与excel映射关系+反射设置实体属性值) poi导出导入封装(使用注解建立实体与excel映射关系+反射设置...
【反射与注解】是Java编程中的重要概念,它们提供了对程序运行时元数据的访问和操作能力。在Java中,反射(Reflection)允许我们在运行时动态地获取类的信息(如类名、方法、属性等),甚至能够调用私有方法和修改...
在Android开发中,注解(Annotation)和...通过深入理解和运用注解与反射,开发者可以进一步优化代码结构,提高应用程序的质量。在实际项目中,类似的框架可以作为一个基础工具库,方便快速开发新功能,降低维护成本。