- 浏览: 3436732 次
- 性别:
- 来自: 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 1885public static void applyV ... -
42 自定义泛型类的应用
2011-12-23 09:50 1590l 如果类的实例对 ... -
40 自定义泛型方法及其应用41 自定义泛型方法的练习与类型推断总结
2011-12-23 09:49 160140 自定义泛型方法及其应用 l <!--[e ... -
38 泛型的通配符扩展应用39 泛型集合的综合应用案例
2011-12-23 09:49 121738 泛型的通配符扩展应用 泛型中的?通配符: l问 ... -
36 入门泛型的基本应用37 泛型的内部原理及更深应用
2011-12-23 09:49 115136 入门泛型的基本应用 <!--[if !su ... -
32 使用BeanUtils工具包操作JavaBean
2011-12-22 10:02 1497Beanutils工具包: l 演示用eclipse ... -
30-31内省访问JavaBean属性的两种方法
2011-12-22 10:02 221830 对JavaBean的简单内省操作 //pt ... -
29 由内省引出JavaBean的讲解
2011-12-22 10:02 1373IntroSpector内省—> ... -
28 用类加载器的方式管理资源和配置文件
2011-12-22 10:01 1495/*getRealPath();//金山词霸/内部 ... -
27框架的概念及用反射技术开发框架的原理
2011-12-21 09:38 1104反射的作用à实现框架功能 *框架与框架要解决的 ... -
解释equals(),hashcode()和==
2011-12-21 09:38 1574简单的结论:当对象类没有不符合规范的override e ... -
26 ArrayList_HashSet的比较及Hashcode分析
2011-12-21 09:38 1614只有类的实例对象要被采用哈希算法进行存储和检索时,这个类 ... -
23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用
2011-12-21 09:37 125623对接收数组参数的成员方法进行反射 packa ... -
18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
2011-12-21 09:37 148518 理解反射的概念 反射 一、反射就是Java类中 ... -
17 透彻分析反射的基础_Class类
2011-12-20 11:16 1374Java类用于描述一类事物的共性,该类事物有什么属性,没 ... -
12-16 jdk5枚举
2011-12-20 10:55 1256模拟枚举,其实枚举编译后就是如此: pac ... -
11 jdk5基本数据类型的自动拆箱与装箱
2011-12-20 10:36 1588package cn.zyj11.revie ... -
09jdk5可变参数与OverLoad;10java5的增加for循环
2011-12-20 10:34 1344package cn.zyj0910.review ... -
08 jdk5的静态导入
2011-12-20 10:31 1190import语句可以导入一个类或某个包中的所有类 im ...
相关推荐
Java的反射机制是指在程序的运行状态中,**可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用,操作任意一个对象的属性和方法。**这种动态获取程序信息以及...
1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...
适用于有一定Java编程基础的开发人员,希望了解和应用Java反射机制的使用者。 使用场景及目标 使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段...
java提供的注解技术,这里很基础的提供了注解的简单实现样例,SpringMVC采用了很多的注解,基本简单案例展现想了解下注解的同学,对类的方法进行顺序注解后,可以按照注解自动按照顺序调用方法。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象; 注意 : 1、 Class类 和它的实例的产生: Class的对象是已经存在的类型, 所以不...
这个一个自定义注解实现给注解传递伪动态参数的小案例,可以在此自定义注解的基础上来记录接口的调用记录。
一、注解基本了解和应用 1、何为注解? 注解是一种标记,在程序中加了注解等于加了标记,没加,没有标记。 2、注解有何作用? 加了注解,java编译器、开发工具或是其他程序可以通过反射技术了解你的类或...
前言 公司前端项目用的是vue,后端...在使用自定义注解之前,我们先来了解Java为我们提供的元注解和相关定义注解的语法。 一、了解Java注解语法 1.元注解(meta-annotation) 元注解的作用就是负责注解其他注解,在java.
利用反射获取requestMapping注解的value,springMvc实现路径映射功能的逻辑
自定义注解,实现了findViewById 和 OnCLIckListener 注解不会去新建一个OnClickListener对象,所有view都指向一个listener, 然后通过反射调用方法去执行
主要介绍了在springboot中使用注解将值注入参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级特性-自定义TypeFilter n 高级特性-ImportSelector和ImportBeanDefinitionRegistrar的分析 n 高级特性-自定义ImportSelector n ...
用Bean的方式以及注解的方式实现的dubbo调用,该demo是一份Maven项目,包含服务端,客户端,实现RPC的远程服务调用。
* @content ejb3注解的API定义在javax.persistence.*包里面。 * * 注释说明: * @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类) * @Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。 * ...
利用注解修改webservice生成wsdl的服务名称,命名空间,返回值,调用方法。加强安全性。代码完整,包括服务端和客户端两个项目
hibernate@注解方式配置实体类时,利用javadoc接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或加入...
刚接触SpringMVC几天、代码肯定比不上大佬ε...初步使用反射注解实现动态调用方法 初步了解SpringMVC @Controller、@RequestMapping、@requestParam用法及原理 _φ(❐_❐✧ 人丑就要多读书 不熬夜不追剧~( ̄▽ ̄)~*
主要介绍了Java使用注解和反射简化编程的方法,结合实例形式分析了java使用注解和反射调用大量函数简化编程的相关操作技巧,需要的朋友可以参考下
springboot中@Async异步调用注解的使用
Java基础 反射篇 ...通过反射调用方法 反射的应用场景 Spring 的 IOC 容器 反射 + 抽象工厂模式 JDBC 加载数据库驱动类 反射的优势及缺陷 增加程序的灵活性 破坏类的封装性 性能损耗 反射基础篇文末总结