- 浏览: 132259 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
feng_tai_jun:
sudo openconnect -b -u MyUserNa ...
ubuntu 下使用openconnect 连接vpn
Annotation 注解,个人简单的理解就是加在方法,类,变量上的标记,即注解。通过Annotation可以筛选出你想要的类,方法,变量等。(纯个人理解,如果不对请指出! (∩_∩))。接下来就是重头戏自定义注解,自定义注解非常的方便,看代码:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Name { String name() ; String desc() default "no description"; }
这样就定义了一个名为Name的注解了,接下来看如果使用。
public class User { @Name(name="jack",desc="the great man") public void getName(){ System.out.println("I'm user1"); } @Name(name="tom",desc="the good man") public void getName2(){ } }
很简单,接下来说明一下代码。在代码1中,
第一行@Target(ElementType.METHOD), 他代表着注解的修饰范围,类型是java.lang.annotation.ElementType枚举类型。
public enum ElementType { TYPE,//可以修饰类、接口、枚举、注解 FIELD,//可以修饰成员变量 METHOD,//可以修饰方法 PARAMETER,//可以修饰参数 CONSTRUCTOR,//可以修饰构造方法 LOCAL_VARIABLE,//可以修饰局部变量 ANNOTATION_TYPE,// 可以修饰Annotation PACKAGE//可以修饰包 }
第二行@Retention(RetentionPolicy.RUNTIME),表示注解保留的有效期
//会将注解保留到编译后的class中,加载类的时候不生效 @Retention(RetentionPolicy.CLASS) //仅仅在代码保留,编译后的class不会保留 @Retention(RetentionPolicy.SOURCE) //在编译后的class会有,通过反射也会获得注解信息 @Retention(RetentionPolicy.RUNTIME)
接下来可以通过实例进一步的理解:
实例要完成的内容:假设我定义了一个名为Component的注解,然后找到指定包下含有Component注解的类并对其初始化。
首先定义Component注解
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Component { String value(); }
然后分别在User1 User2中加入Component注解
@Component("user1") public class User1 { public void getName(){ System.out.println("I'm user1"); } } @Component("user2") public class User2 { public void getName(){ System.out.println("I'm user2"); } }
之后可通过Java的反射机制。获取类的Annotation
public class AnnotationTest3 { public static void main(String[] args) { Map<String,Object> map = createBean("com.use",Component.class); User1 u1 = (User) map.get("user1"); User2 u2= (User2) map.get("user2"); u1.getName(); u2.getName(); } public static Map<String,Object> createBean(String packageName,Class<? extends Annotation> annotation) { List<String> classNames = getPackageAllClassName(packageName); Map<String,Object> map = new HashMap<String,Object>(); try { for(String className : classNames){ Class clazz; clazz = Class.forName(packageName +"." + className); //此处只有注解的RetentionPolicy选为RunTime,Annotation才能被取得,因为只有RunTime才被载入Jvm if(clazz.isAnnotationPresent(annotation)){ Method method = annotation.getDeclaredMethod("value"); method.setAccessible(true);//此处不是设置让此方法可以访问,而是取消了java在访问此方法时的访问检测,可以大大提高效率 String name = (String)method.invoke(clazz.getAnnotation(annotation)); Object o = clazz.newInstance(); map.put(name, o); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } public static List<String> getPackageAllClassName(String packageName){ String classPath = getClassPath(); List<String> classNames = new ArrayList<String>(); packageName = packageName.replaceAll("[.]", "/"); String location = classPath + packageName; File packageDir = new File(location); if(packageDir.isDirectory()){ String[] fileNames = packageDir.list(); for(String name : fileNames){ if(name.endsWith(".class")){ classNames.add(name.substring(0,name.indexOf("."))); } } } return classNames; } public static String getClassPath(){ return AnnotationTest3.class.getResource("/").getPath(); } }
参考:http://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html
http://huoyanyanyi10.iteye.com/blog/1317614
http://www.son1c.cn/show/859.html
发表评论
-
java初始化属性 (转)
2012-01-09 15:59 1270转自:http://www.cnblogs.com/miniw ... -
HashSet hashCode equals
2011-10-09 09:52 1138在使用HashSet 的时候往往需要重写他的equals和ha ... -
(转)修改eclipse中的默认maven2资源仓库保存地址(很有用的)
2011-07-11 16:52 1092转:http://blog.csdn.net/doublel/ ... -
HTTP请求头与应答头参数(转)
2011-03-19 15:50 3789HTTP请求头 Accept:浏览器 ... -
使用json必须的包
2011-02-17 15:25 1259commons-logging-1.0.4.jar ... -
搞懂java中的synchronized关键字(转)
2011-01-29 17:16 880转载:http://www.learndiary. ... -
JAVA中的指针,引用及对象的clone(转)
2011-01-29 17:04 850http://www.ibm.com/developerwor ... -
Java中static、this、super、final用法(转载)
2011-01-22 18:35 744http://developer.51cto.com/art/ ... -
JAVA对象的初始化过程
2011-01-22 17:58 822http://blog.mcuol.com/User/mcuo ... -
(转载)Java Exception处理之最佳实践
2011-01-05 18:36 708关键字: java/java编程 本文是Exception ... -
(转)异常设计----何使用异常的原则
2011-01-05 18:32 744(转)异常设计----何使用 ... -
java GC 理解(转载)
2010-12-30 08:34 934转载地址:http://hannoi200 ... -
使用JDK的javap工具,反汇编由javac编译器生成的.class文件
2010-12-16 09:15 1613用javap -c Test > Test.bc ... -
java 进行类初始化的情况
2010-12-16 09:01 856java类通过装载,连接,解析使一个类型可以被使用,如果遇到以 ... -
字符串 字符指针(1)
2010-12-14 11:42 752char *p1="abcd",*p ... -
jar命令设置jar 主类
2010-12-12 17:49 1512在类文件目录下 jar -cvfe textDeal. ... -
Java向文件中写入换行符(回车符)
2010-12-12 16:06 2133linux和unix系统的换行是"\n", ...
相关推荐
总结起来,自定义Annotation是Java中强大的工具,可以帮助我们编写更加可读、可维护的代码,并且可以与编译器和运行时环境进行交互。通过定义自己的注解,我们可以实现代码的元数据化,从而实现自动化、验证、监控等...
### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...
在本案例中,作者创建了三个自定义注解,具体细节虽未详述,但我们可以深入探讨一下Java自定义注解的基本概念、创建过程以及如何进行验证。 首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种...
在IT行业中,自定义注解(Annotation)是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,增强了代码的可读性和可维护性。这些元数据可以被编译器或运行时环境用来执行特定的任务,例如代码分析、...
Java自定义注解是Java编程语言中的一个重要特性,它允许程序员在代码中插入元数据,这些元数据可以被编译器或运行时环境用来执行特定的任务。自定义注解不仅提高了代码的可读性,还简化了代码处理,特别是在框架和库...
总结起来,自定义Annotation注解是Java中强大的工具,它允许程序员以声明式方式添加元数据,从而简化代码和提高可维护性。`CustomAnnotationDemo`是一个基础示例,展示了如何定义、使用和处理自定义注解,对于理解这...
"java自定义注解实践" Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ----...
通过以上步骤,你的自定义`annotationProcessor`将在编译时自动运行,根据你在源代码中使用的注解生成相应的Java类。这种编译时代码生成的能力极大地增强了Java的灵活性和可扩展性,是现代Java开发中的重要工具之一...
Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来...
### 实现Java自定义注解拦截器 #### 概述 本文主要介绍如何在Spring Boot项目中使用自定义注解来实现对特定方法的拦截功能。具体场景为:当访问项目中的控制器方法时,需要进行“token验证”,但登录等特殊方法...
在Java编程中,自定义注解(Annotation)是一种强大的元数据机制,允许程序员在源代码中插入信息,这些信息可以被编译器、IDE或运行时环境用来进行各种处理。自定义注解使得代码更加可读,易于维护,并且可以自动化...
Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...
Java自定义注解和通过反射获取注解是Java编程中重要的高级特性,它们极大地增强了代码的可读性和可维护性。注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行标记的方法,而反射(Reflection)则是...
Java自定义注解是Java平台提供的一种元编程机制,它允许程序员在代码中插入特定的标记,这些标记可以在编译时或运行时被处理器解析,从而实现特定的功能。自定义注解可以用来增强代码的可读性,简化代码处理,以及...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...
自定义注解是扩展Java功能的强大工具,可以用于实现各种目的,如代码生成、编译时检查、运行时处理等。在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于...
自定义Annotation实际上自动继承了`java.lang.annotation.Annotation`接口,但不能继承其他Annotation类型或接口。这使得Annotation成为一种单继承的类型。 总之,Annotation技术是Java编程中的一个强大工具,它...