java注解试用及通过反射读取值
2017-08-29 11:36
357 查看
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第
4000
三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第
4000
三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
public abstract String name() default "";// 默认值为“”
}
@Target是注解类型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第二步
用Java反射写一个工具类读取注解
public class AnUtils {
public static void getFruitInfo(Class<?> clazz){
String strFruitName=" 水果名称:";
Field[] fields = clazz.getDeclaredFields();
//@Target=FIELD 运行
for(Field field :fields){
if(field.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
// //@Target=TYPE 运行
if(clazz.isAnnotationPresent(Fruit.class)){
Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
strFruitName=strFruitName+fruitName.name();
System.out.println(strFruitName);
}
}
}
第三步
写个测试类
在 @Target=TYPE时
@Fruit(name="123")
public class AnnotionTest {
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
在 @Target=FIELD时
public class AnnotionTest {
@Fruit(name="123")
public static String name;
public static void main(String[] args) {
AnUtils.getFruitInfo(AnnotionTest.class);
}
}
输出: 水果名称:123
相关文章推荐
- java再复习——通过反射读取注解
- 基于注解和反射的Java ORM框架(1)-通过注解描述映射关系
- Java--注解及反射读取注解
- java读取xml获得list并通过反射赋值给javabean
- Java 自定义注解及利用反射读取注解
- Java通过反射获取自定义注解
- java注解,通过反射解析注解,模仿hibernate,获取sql语句。
- Java中通过注解+反射拿到对象的属性和方法
- 创建对象列中文注解并通过反射读取使用
- 自己动手设计java web框架(二)-自定义注解以及通过反射获取注解
- Java进阶之reflection(反射机制)——通过反射操作泛型,注解
- java通过反射+注解获取两个对象改变的内容
- java通过读取本地文件获取反射方法参数,执行对象方法
- java中自定义注解并通过反射获取注解属性值
- java 自定义注解annotation和通过反射获取注解
- java通过反射获取类名、属性名称以及@Table注解上的表名称
- java中自定义注解并通过反射获取注解属性值
- java 通过反射获取注解
- java中自定义注解并通过反射获取注解属性值
- 注解_Annotation_内置注解_自定义注解_反射机制读取注解JAVA208-210