`

注解和反射使用

阅读更多

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

 主要学习两方面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 属性注解,并且注解有两个属性

 

<span style="color: #ff6600;">@Target(value=ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)</span>
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") /<span style="color: #ff6600;">/没有指定注解的name 则默认name为value 等同于 value="s_name"</span>
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注解和反射的个人学习笔记

    Java自定义注解使用反射获取字段注解

    Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查...理解并熟练运用自定义注解和反射,能够显著提升代码的质量和效率。

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

    Java注解和反射是Java编程中的重要特性,它们极大地增强了代码的灵活性和可维护性。在Java中,注解(Annotation)是一种元数据,它提供了将信息附加到代码(类、方法、变量等)的方式,而反射则允许我们在运行时检查...

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

    在Android开发中,注解(Annotation)和反射(Reflection)是两个重要的概念,它们极大地提升了代码的可维护性、灵活性和动态性。本篇将详细阐述这两个知识点,并结合实际示例进行讲解。 **注解(Annotation)** 1...

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

    在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。

    一种基于Java注解和反射机制的Excel文件读写操作方法.pdf

    根据提供的文件信息,我们可以梳理出以下知识点: ...以上知识点详细阐述了文档中提到的方法和技术原理,为理解和应用Java注解和反射机制在Excel文件读写操作中的实际应用提供了理论基础和技术指导。

    注解和反射机制的学习笔记

    例如,Lombok库使用注解处理器在编译时自动添加getter、setter、equals、hashCode和toString方法,而MyBatis框架允许开发者通过注解定义SQL语句,这些语句在运行时通过反射被解析并执行。 总的来说,注解和反射是...

    java注解、java反射机制 jdbc 封装

    Java注解和反射机制是Java开发中的重要工具,它们极大地增强了代码的可读性和灵活性。在结合JDBC(Java Database Connectivity)API时,可以构建出更高效、更易维护的数据访问层。本案例通过注解的方式,简化了JDBC...

    使用注解和反射构建数据库框架

    本主题将深入探讨如何利用Java的注解(Annotation)和反射(Reflection)技术来构建一个自定义的数据库框架。通过这种方式,开发者不仅可以更好地理解这些核心Java特性,还能提升开发效率。 注解是Java提供的一种元编程...

    java基础知识学习教程-12注解和反射.pptx

    11. 案例:三酷猫的注解反射对比小程序 本节提供了一个案例,演示了如何使用注解和反射机制来实现一个小程序。 12. 练习和实验 本节提供了一些练习和实验题目,旨在帮助读者更好地理解和掌握注解和反射机制的知识点...

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

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

    java基础之注解和反射

    java基础之注解和反射

    仿Litepal 注解和反射实现的数据框架

    本项目旨在模仿Litepal,利用注解和反射技术来构建一个类似的数据框架,使得数据库操作更加便捷、高效。 首先,让我们了解注解(Annotation)和反射(Reflection)的基本概念。注解是Java提供的一种元编程机制,它...

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

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

    servlet反射注解例子

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

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

    这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...

    Java-JDBC【源码】实现ORM,结果集映射实体类(ResultSet、注解、反射)

    Java-JDBC【之】实现ORM,结果集映射实体类(ResultSet、注解、反射) 1.ORM实现思路 2.@Table、@Column、标识实体类 2.1.创建注解 @Table、@Column 2.2.标识实体类 2.3.数据库表 3.结果集解析,注解加反射填充实体...

    Java基础篇之注解和反射

    Java基础注解和反射入门思维导图 毕竟在SpringBoot以及之后使用的基本全是注解很少用配置文件 反射是必须要会的

    运用注解改变反射之后类属性的顺序

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,当我们通过反射获取类的属性时,可能会遇到一个常见的问题:属性的顺序并不总是按照我们期望的方式呈现。默认情况下...

Global site tag (gtag.js) - Google Analytics