`

反射与注解的使用

    博客分类:
  • java
阅读更多

 

作用:注解是附加在代码中的一些信息,用于编译、运行时解析和使用,起到说明配置作用 

主要学习两方面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自定义注解使用反射获取字段注解

    现在,我们可以使用反射机制来获取这个注解。Java的`Field`类提供了`getAnnotation(Class&lt;A&gt; annotationClass)` 方法,用于获取指定类型的注解: ```java public class AnnotationReflectionDemo { public static ...

    反射和注解模拟JUnit4单元测试例子

    介绍如何利用反射和注解去简单的模拟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、...

    使用反射和注解模拟Spring的依赖注入

    在Java编程中,Spring...总的来说,理解和掌握反射与注解对于深入学习Spring框架至关重要。通过模拟Spring的依赖注入,开发者可以更好地领悟到IoC和DI的核心思想,从而在实际开发中更有效地利用Spring框架提供的功能。

    servlet反射注解例子

    本示例“servlet反射注解例子”旨在帮助我们深入理解如何将这两种技术结合使用,以实现更加灵活和可维护的服务器端应用程序。本文将详细探讨反射和注解在Servlet中的应用。 首先,让我们来了解一下什么是反射。反射...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已过时。注解可以应用于类、接口、字段、方法等。注解本身不直接影响程序的执行,但...

    java注解和反射的12个demo.zip

    1. **注解的创建与使用**:展示如何自定义注解以及如何在代码中使用这些注解。 2. **元注解的运用**:例如`@Retention`、`@Target`等元注解的使用,控制注解的生命周期和作用范围。 3. **注解处理器**:演示如何编写...

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    java自定义注解和通过反射获取注解

    Java自定义注解和通过反射获取...总的来说,理解并熟练掌握Java自定义注解和反射的使用,对于提升Java开发者的编程能力和编写高质量代码具有重要意义。通过深入学习和实践,你可以创造出更加优雅和强大的Java应用程序。

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    反射,注解原理和使用的方法

    5. **反射与注解结合使用**: - 在运行时,可以通过反射获取类上的注解,判断是否需要执行特定逻辑。 - 自定义注解处理器可以利用反射来动态地创建对象、调用方法,实现灵活的代码生成和运行时行为控制。 理解并...

    反射操作注解与反射操作泛型.docx

    反射操作注解与反射操作泛型 在 Java 编程中,反射操作和泛型是两个重要的概念。反射操作是指在运行时检查和修改类、对象、方法、字段等信息的能力,而泛型是指在编译时检查和限制类型的能力。本文将详细介绍反射...

    Android-注解与反射注解知识点反射知识点注解java反射

    6. **注解与反射**:反射可以读取类、方法、字段上的注解信息,这在运行时动态处理逻辑、实现插件化等方面非常有用。 在`AnnotationDemo-master`这个项目中,可能包含了注解和反射的实践案例,例如通过注解定义接口...

    反射注解暴力反射详细思维导图.xmind

    反射注解暴力反射详细思维导图.xmind

    反射+注解自定义ORM

    本主题探讨的是如何通过反射和注解来自定义ORM框架,以简化数据库操作。以下是关于这个主题的详细知识点: 1. **反射(Reflection)**: Java反射是Java语言的一项高级特性,它允许运行中的Java程序对自身进行检查...

    poi导出导入封装(使用注解建立实体与excel映射关系+反射设置实体属性值)

    poi导出导入封装(使用注解建立实体与excel映射关系+反射设置实体属性值), poi导出导入封装(使用注解建立实体与excel映射关系+反射设置实体属性值) poi导出导入封装(使用注解建立实体与excel映射关系+反射设置...

    反射与注解PPT学习教案.pptx

    【反射与注解】是Java编程中的重要概念,它们提供了对程序运行时元数据的访问和操作能力。在Java中,反射(Reflection)允许我们在运行时动态地获取类的信息(如类名、方法、属性等),甚至能够调用私有方法和修改...

    android 反射注解框架

    在Android开发中,注解(Annotation)和...通过深入理解和运用注解与反射,开发者可以进一步优化代码结构,提高应用程序的质量。在实际项目中,类似的框架可以作为一个基础工具库,方便快速开发新功能,降低维护成本。

Global site tag (gtag.js) - Google Analytics