您的位置:首页 > 编程语言 > Java开发

java反射和自定义注解的使用实例

2017-05-26 11:03 573 查看
反射学习博客:http://blog.csdn.net/west_three_boy/article/details/72760625

自定义注解:

package interfaceAnotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * 
 * @author liangyuyi
 *
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Extension {
String value();
}

注解说明:

(转载:http://www.cnblogs.com/anpajin/p/6376917.html)

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
    1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域

    3.LOCAL_VARIABLE:用于描述局部变量

    4.METHOD:用于描述方法

    5.PACKAGE:用于描述包

    6.PARAMETER:用于描述参数

    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
比如说:如果使用的是ElementType.TYPE的话,下面的@Extension(..)只能写在类上面

转载:http://www.jb51.net/article/55371.htm

@Retention(RetentionPolicy.RUNTIME)注解表明Extension注解将会由虚拟机保留,以便它可以在运行时通过反射读取.

Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:
1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.

Documented 注解表明这个注解应该被
javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中. 

@Inherited 标记,然后用定义的注解来标注另一个父类,
父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中

自定义注解的使用:
package interfaceAnotation;

/**
* 使用自定义注解的实例
*
* @author liangyuyi
*
*/

public class ExtensionExample {
@Extension(ConstsCode.code1)
public void printcode1() {
System.out.println("this is code1");
}

@Extension(ConstsCode.code2)
public void printcode2() {
System.out.println("this is code2");
}

@Extension(ConstsCode.code3)
public void printcode3() {
System.out.println("this is code3");
}
}


常量类
package interfaceAnotation;

/**
* 常量类,保存业务逻辑号
*
* @author liangyuyi
*
*/
public class ConstsCode {

public static final String code1 = "001";
public static final String code2 = "002";
public static final String code3 = "003";
}


测试类:

package interfaceAnotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* 反射和注解的测试类
*
* @author liangyuyi
*
*/
public class MainTest {
public static void main(String[] args) {
// 通过反射机制获取ExtensionExample
Class<?> clazz = new ExtensionExample().getClass();

// 获取类方法
Method[] methods = clazz.getMethods();

for (Method method : methods) {
Extension methodAnota = method.getAnnotation(Extension.class);// 获取方法中的Extension注解
if (methodAnota != null) {
String anotaValue = methodAnota.value();// 获取注解的内容
System.out.println("the " + method.getName() + " anotation is " + anotaValue);
try {
method.invoke(clazz.newInstance());// 执行类方法
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐