- 浏览: 3466171 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
33 了解和入门注解的应用
l 先通过@SuppressWarnings的应用让大家认识和了解一下注解:
Ø 通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")
l @Deprecated
Ø 直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。
l @Override
Ø public boolean equals(Reflect other)方法与HashSet结合讲解
l 总结:
Ø 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
Ø 看java.lang包,可看到JDK中提供的最基本的annotation。
34 注解的定义与反射调用
注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。就像你要调用某个类,得先有开发好这个类。
自定义注解及其应用:
l 定义一个最简单的注解:public @interface MyAnnotation {}
l 把它加在某个类上:@MyAnnotation public class AnnotationTest{}
l 用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
l 根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
注解的默认值是在class阶段。
@Override是给javac看的,编译完就没有价值了,也就说只有在源代码中有用,所以属性值是@Retention(value=SOURCE)
@SuppressWarnings的属性值是@Retention(value=SOURCE)
@Deprecated的属性值是@Retention(value=RUNTIME)
PS:class文件中的东西不是字节码,只有经过一系列的检查后加载到内存中才是字节码。
l 演示和讲解@Target元注解
Ø Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
l <!--[endif]-->元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。
package cn.zyj35.review; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { }
package cn.zyj35.review; @ItcastAnnotation() public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); //用反射进行测试的代码: //检查返回的注解对象的类名,发现它其实是一个代理。 if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){ ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation); } } @Deprecated public static void sayHello(){ System.out.println("hi,传智播客"); } }
35为注解增加各种属性
为注解增加基本属性:
l 什么是注解的属性
Ø 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")
l 定义基本类型的属性和应用属性:
Ø 在注解类中增加String color();
Ø @MyAnnotation(color="red")
l 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
Ø MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
Ø System.out.println(a.color());
Ø 可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
l 为属性指定缺省值:
Ø String color() default "yellow";
l value属性:
Ø String value() default "zxx";
Ø 如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
为注解增加高级属性:
l 数组类型的属性
Ø int [] arrayAttr() default {1,2,3};
Ø @MyAnnotation(arrayAttr={2,3,4})
Ø 如果数组属性中只有一个元素,这时候属性值部分可以省略大括
l 枚举类型的属性
Ø EnumTest.TrafficLamp lamp() ;
Ø @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
l 注解类型的属性:
Ø MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
Ø @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
Ø 可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
l 注解的详细语法可以通过看java语言规范了解,即看java的language specification。
Ps:
注解的属性可以是八个,基本数据类型,String类型,Class类型,enum类型,annotation类型,和前面所有的数组类型。
Ps:
枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可
MetaAnnotation注解的定义:
public @interface MetaAnnotation {
String value();
}
例子:
package cn.zyj35.review; public enum TrafficLamp { //内部类。如果枚举元素后面没有大括号对,那是不会生成内部类的。 RED(30){ public TrafficLamp nextLamp(){ return GREEN; } }, GREEN(45){ public TrafficLamp nextLamp(){ return YELLOW; } }, YELLOW(5){ public TrafficLamp nextLamp(){ return RED; } }; public abstract TrafficLamp nextLamp(); private int time; private TrafficLamp(){} private TrafficLamp(int time){this.time = time;} public String toString(){ if (this==RED) { return "红"; } else if(this==GREEN){ return "绿"; }else{ return "黄"; } } }
package cn.zyj35.review; public @interface MetaAnnotation { String value(); }
package cn.zyj35.review; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { int num() default 1; String color() default "blue"; String value(); int[] arrayAttr() default {3,4,4}; TrafficLamp lamp() default TrafficLamp.RED; MetaAnnotation annotationAttr() default @MetaAnnotation("lhm"); Class strClass() default String.class; }
package cn.zyj35.review; import java.lang.reflect.Method; @ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1) public class AnnotationTest { @SuppressWarnings("deprecation") @ItcastAnnotation("方法注解") public static void main(String[] args) throws Exception { System.runFinalizersOnExit(true); //用反射进行测试的代码: //检查返回的注解对象的类名,发现它其实是一个代理。 if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){ ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation); System.out.println(annotation.num()); System.out.println(annotation.color()); System.out.println(annotation.value()); System.out.println(annotation.arrayAttr().length);//int[]是Object,不是Object[] System.out.println(annotation.lamp().nextLamp().name()); System.out.println(annotation.annotationAttr().value()); System.out.println(annotation.strClass().toString()); } Method mainMethod = AnnotationTest.class.getMethod("main", String[].class); ItcastAnnotation annotation2 = (ItcastAnnotation)mainMethod.getAnnotation(ItcastAnnotation.class); System.out.println(annotation2.value()); } @Deprecated public static void sayHello(){ System.out.println("hi,china"); } }
发表评论
-
43 通过反射获得泛型的实际类型参数
2011-12-24 00:01 1945public static void applyV ... -
42 自定义泛型类的应用
2011-12-23 09:50 1643l 如果类的实例对 ... -
40 自定义泛型方法及其应用41 自定义泛型方法的练习与类型推断总结
2011-12-23 09:49 164940 自定义泛型方法及其应用 l <!--[e ... -
38 泛型的通配符扩展应用39 泛型集合的综合应用案例
2011-12-23 09:49 125938 泛型的通配符扩展应用 泛型中的?通配符: l问 ... -
36 入门泛型的基本应用37 泛型的内部原理及更深应用
2011-12-23 09:49 118636 入门泛型的基本应用 <!--[if !su ... -
32 使用BeanUtils工具包操作JavaBean
2011-12-22 10:02 1540Beanutils工具包: l 演示用eclipse ... -
30-31内省访问JavaBean属性的两种方法
2011-12-22 10:02 224630 对JavaBean的简单内省操作 //pt ... -
29 由内省引出JavaBean的讲解
2011-12-22 10:02 1401IntroSpector内省—> ... -
28 用类加载器的方式管理资源和配置文件
2011-12-22 10:01 1528/*getRealPath();//金山词霸/内部 ... -
27框架的概念及用反射技术开发框架的原理
2011-12-21 09:38 1145反射的作用à实现框架功能 *框架与框架要解决的 ... -
解释equals(),hashcode()和==
2011-12-21 09:38 1615简单的结论:当对象类没有不符合规范的override e ... -
26 ArrayList_HashSet的比较及Hashcode分析
2011-12-21 09:38 1656只有类的实例对象要被采用哈希算法进行存储和检索时,这个类 ... -
23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用
2011-12-21 09:37 128823对接收数组参数的成员方法进行反射 packa ... -
18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
2011-12-21 09:37 152618 理解反射的概念 反射 一、反射就是Java类中 ... -
17 透彻分析反射的基础_Class类
2011-12-20 11:16 1407Java类用于描述一类事物的共性,该类事物有什么属性,没 ... -
12-16 jdk5枚举
2011-12-20 10:55 1300模拟枚举,其实枚举编译后就是如此: pac ... -
11 jdk5基本数据类型的自动拆箱与装箱
2011-12-20 10:36 1633package cn.zyj11.revie ... -
09jdk5可变参数与OverLoad;10java5的增加for循环
2011-12-20 10:34 1380package cn.zyj0910.review ... -
08 jdk5的静态导入
2011-12-20 10:31 1231import语句可以导入一个类或某个包中的所有类 im ...
相关推荐
在编程世界中,注解(Annotation)是一种元数据,它为编译器、JVM(Java虚拟机)或工具提供信息,以优化程序的编写、分析和执行过程。本篇文章将深入探讨注解的基本概念、类型以及它们在实际开发中的应用。 首先,...
1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已过时。注解可以应用于类、接口、字段、方法等。注解本身不直接影响程序的执行,但...
本文将详细探讨反射和注解在Servlet中的应用。 首先,让我们来了解一下什么是反射。反射是Java编程语言的一种特性,它允许运行中的程序检查和操作类、接口、方法和字段等对象。通过反射,我们可以在运行时动态地...
Java作为云计算环境下编写应用和服务的主要语言之一,其泛型、反射和注解等高级特性为构建云计算平台上的应用提供了便利,从而满足不断变化的业务需求。 学习Java编程,特别是泛型、反射和注解这些高级特性,对于想...
在`AnnotationDemo-master`这个项目中,可能包含了注解和反射的实践案例,例如通过注解定义接口规范,然后在运行时通过反射动态调用相应的实现类。这样的设计模式在Android组件化、插件化开发中十分常见,能够提高...
在Java中,注解(Annotation)是一种元数据,它提供了将信息附加到代码(类、方法、变量等)的方式,而反射则允许我们在运行时检查类、接口、字段和方法的属性,并能动态调用方法或访问字段。 注解的作用主要有以下...
在Java编程中,Spring...总的来说,理解和掌握反射与注解对于深入学习Spring框架至关重要。通过模拟Spring的依赖注入,开发者可以更好地领悟到IoC和DI的核心思想,从而在实际开发中更有效地利用Spring框架提供的功能。
例如,Lombok库使用注解处理器在编译时自动添加getter、setter、equals、hashCode和toString方法,而MyBatis框架允许开发者通过注解定义SQL语句,这些语句在运行时通过反射被解析并执行。 总的来说,注解和反射是...
涵盖了注解的基本概念、内置注解、元注解和自定义注解等知识点,并引入反射机制,详细介绍了反射的概念、Class类、通过反射获取注解、通过反射创建对象、通过反射调用方法和属性等知识点。 1. 注解的基本概念 Java...
在本文中,我们将深入探讨如何使用Spring注解进行属性注入,并重点关注`@Autowired`和`@Qualifier`这两个关键注解。 1. **使用`@Autowired`注解** 在传统的Spring配置中,我们需要在XML配置文件中手动定义bean及其...
Java注解和反射机制是Java开发中的重要工具,它们极大地增强了代码的可读性和灵活性。在结合JDBC(Java Database Connectivity)API时,可以构建出更高效、更易维护的数据访问层。本案例通过注解的方式,简化了JDBC...
在Java编程领域,反射、泛型和注解是三个非常重要的特性,它们为代码提供了高度的灵活性和可扩展性。在本实战项目中,我们将深入探讨如何利用这些特性实现一个类似Spring框架的核心注入机制,即控制反转(Inversion ...
首先,让我们了解注解(Annotation)和反射(Reflection)的基本概念。注解是Java提供的一种元编程机制,它允许在源代码中嵌入一些元数据,这些元数据可以被编译器或运行时环境解析并执行相应的处理。反射则是Java...
反射(Reflection)是Java的一个强大特性,允许程序在运行时检查类、接口、字段和方法的信息,甚至能够动态调用方法和修改对象状态。《利用反射技术处理自定义注解》的设计与实现,旨在探讨如何结合这两种机制以实现...
### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...
在Android开发中,注解(Annotation)和...通过深入理解和运用注解与反射,开发者可以进一步优化代码结构,提高应用程序的质量。在实际项目中,类似的框架可以作为一个基础工具库,方便快速开发新功能,降低维护成本。
要创建一个自定义注解,我们需要定义一个注解类型,并指定它的属性。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyCustomAnnotation { String value() ...
通过反射,我们可以动态地创建对象、调用方法、访问和修改私有属性,实现动态加载类,以及进行元数据分析等。反射的应用场景广泛,如插件系统、框架设计、单元测试等。 注解(Annotation)是Java中的元数据,它为...
本文将详细介绍反射操作和泛型在 Java 编程中的应用,特别是结合注解(Annotation)和对象关系映射(ORM)的使用。 一、反射操作 反射操作是 Java 语言中的一种机制,允许程序在运行时检查和修改类、对象、方法、...
自定义注解是扩展Java功能的强大工具,可以用于实现各种目的,如代码生成、编译时检查、运行时处理等。在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于...