Java中最常见的反射及关键类和方法的应用。
概述
运行时类型信息(run time type information),可以使得你在程序运行时发现和使用类型信息。在java中主要有两种方式,一种是传统的RTTI,一种是反射机制,它允许在运行时发现和使用类的信息。
Class对象
jdk中有一个java.lang.Class
类字面常量
在没有类的实例引用时,可以通过类字面常量的方式来获取这个类的Class对象,代码如下:1
2
3
4
5
6
7
8
9package me.fengzhao.typeinfo;
import java.lang.Class ;
class Dog{}
public class ClassTest{
public static void main(String[] args){
Class cl = Dog.class;
System.out.print(cl.getTypeName())
}
}
这段代码将会打印出这个类的完全限定名,通过类名.class这种方法,获取这个类的class对象,通过这个代码,也可以看到class对象用
###
Retention注解
Retention注解标注当前Annotation被保留的时间长短:某些注解仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
取值范围:取值(RetentionPoicy)有:
- SOURCE:被标注的注解只保留到源码级,会被编译器忽略
- CLASS:被标注的注解在编译时会被编译器识别,但会被Java虚拟机忽略。
- RUNTIME:被标注的注解会被Java虚拟机识别,因此可用于运行时环境。
Target注解
Target注解限制了其注解的注解可用于其他哪些Java元素,目标注解指定以下元素类型作为其值:
- ANNOTATION_TYPE 注解类型声明
- CONSTRUCTOR 构造方法声明
- FIELD 字段声明(包括枚举常量)
- LOCAL_VARIABLE 局部变量声明
- METHOD 方法声明
- PACKAGE 包声明
- PARAMETER 参数声明
- TYPE 类、接口(包括注解类型)或枚举声明
Documented注解
Document注解表示只要它制定的注解的元素都应该用Javadoc工具文档化。
Repeatable注解
Repeatable注解过的注解可多次用于同一个声明或类声明。
注解实例
看了这么多概念,下面上代码来理解一下。
声明注解
1 | (RetentionPolicy.RUNTIME) |
这段代码声明了一个AnnotationTest注解,限定了注解的声明周期与使用范围,声明注解与普通接口类似,在interface关键字前加上@符号就可以声明注解。这个注解有两个属性:autor和age,且设置了默认值。
使用注解
1 | "fengzhaoadmin", age=13 ) (author = |
在代码中,使用AnnotationTest去注解类,并设置其注解属性,在classAnnotationTEST中通过反射,打印其注解。继续使用该注解去注解classAnnotationTEST方法,在methodAnnotationTEST中通过反射,打印classAnnotationTEST方法的注解。
内置注解
Java已经内置了一些注解,我们平时经常会见到这些注解。
Deprecated
这个注解是用来标记过时的元素,想必大家在日常开发中经常碰到。编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。使用idea自动补全方法的时候,经常会看到一些方法被加上横线,这就是说明该方法已经被废弃了。
1 | public class Person(){ |
在ide中调用Eating方法的时候,就会提示该方法被弃用。
Ovveride
这个注解的作用是标识某一个方法是否覆盖了它的父类的方法。
1 | public class Fruit { |
Orange类编译不会有问题,Apple类在编译的时候,就会提示相关错误。
SuppressWarnings
SuppressWarnings用来抑制编译器生成警告信息。可以修饰的元素为类,方法,方法参数,属性,局部变量,例如在泛型中使用原生数据类型。
它的定义如下:1
2
3
4
5 ({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
(RetentionPolicy.SOURCE)
public SuppressWarnings {
String[] value();
}
该注解有方法value(),可支持多个字符串参数,使用方法如下:1
"uncheck","deprecation"}). (value={
参考
http://www.importnew.com/10294.html
http://blog.csdn.net/briblue/article/details/73824058