java 什么是实例

2017-03-16

1. 首先看下定义的注解类:

类注解定义, MyClassAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.*;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: class annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.TYPE)

public @interface MyClassAnnotation

{

String uri();

String desc();

}

默认构造方法注解定义,MyConstructorAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: Constructor annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.CONSTRUCTOR)

public @interface MyConstructorAnnotation

{

String uri();

String desc();

}

方法注解定义,MyMethodAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: method annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.METHOD)

public @interface MyMethodAnnotation

{

String uri();

String desc();

}

字段注解定义, MyFieldAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: field annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.FIELD)

public @interface MyFieldAnnotation

{

String uri();

String desc();

}

2. 再看下我们注解的应用和测试:

在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解, 自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.

MySample.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.reflect.*;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: This class is used to show how to use the annotation of each level

*/

@MyClassAnnotation (uri = "com.ross.MySample" , desc = "The class name" )

public class MySample

{

@MyFieldAnnotation (uri = "com.ross.MySample#id" , desc = "The class field" )

public String id;

/**

* Description: default constructor

*/

@MyConstructorAnnotation (uri = "com.ross.MySample#MySample" , desc = "The default constuctor" )

public MySample()

{

}

/**

* Description: normal method

*/

@MyMethodAnnotation (uri = "com.ross.MySample#setId" , desc = "The class method" )

public void setId(String id)

{

this .id = id;

}

/**

* Description: MyAnnotation test

* @throws NoSuchMethodException

* @throws SecurityException

* @throws NoSuchFieldException

*/

public static void main(String[] args) throws SecurityException,

NoSuchMethodException, NoSuchFieldException

{

MySample oMySample = new MySample();

// get class annotation

MyClassAnnotation oMyAnnotation = MySample.class

.getAnnotation(MyClassAnnotation.class );

System.out.println("Class's uri: " + oMyAnnotation.uri() + "; desc: "

+ oMyAnnotation.desc());

// get constructor annotation

Constructor oConstructor = oMySample.getClass().getConstructor();

MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor

.getAnnotation(MyConstructorAnnotation.class );

System.out.println("Constructor's uri: "

+ oMyConstructorAnnotation.uri() + "; desc: "

+ oMyConstructorAnnotation.desc());

// get method annotation

Method oMethod = oMySample.getClass().getDeclaredMethod("setId" ,String. class );

MyMethodAnnotation oMyMethodAnnotation = oMethod

.getAnnotation(MyMethodAnnotation.class );

System.out.println("Method's uri: " + oMyMethodAnnotation.uri()

+ "; desc: " + oMyMethodAnnotation.desc());

// get field annotation

Field oField = oMySample.getClass().getDeclaredField("id" );

MyFieldAnnotation oMyFieldAnnotation = oField

.getAnnotation(MyFieldAnnotation.class );

System.out.println("Field's uri: " + oMyFieldAnnotation.uri()

+ "; desc: " + oMyFieldAnnotation.desc());

}

}

控制台打印结果:

[plain] view plain copy

Class's uri: com.ross.MySample; desc: The class name

Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor

Method's uri: com.ross.MySample#setId; desc: The class method

Field's uri: com.ross.MySample#id; desc: The class field

至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.

更多相关阅读

最新发布的文章