博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 注解
阅读量:5910 次
发布时间:2019-06-19

本文共 6495 字,大约阅读时间需要 21 分钟。

hot3.png

一、java注解介绍

 介绍: ,@Retention、

  1、 : 就是注解放到什么地方!ElementType的枚举类型如下:

     TYPE:类,接口或者enum声明

     FIELD:域(属性)声明

     METHOD:方法声明

     PARAMETER:参数声明

     CONSTRUCTOR:构造方法声明

     ANNOTATION_TYPE:注释类型声明

     PACKAGE:包声明

  2、@Rentation: 表示需要在什么级别保存该注解信息。RetentionPolicy的枚举类型如下:

      SOURCE:注解将被编译器丢弃

     CLASS:注解将会被编译至class文件中,但在运行时jvm不保留

     RUNTIME:运行时保留注解

  3、@Documented:此注解将包含在javadoc中

二、代码示例

1、工程截图

161524_Iftr_1754093.png

2、代码

注解类代码

package com.yujin.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 自定义注解 * 介绍:@Target,@Retention、@Document * 1、@Target : 就是注解放到什么地方!ElementType的枚举类型如下: *   TYPE:类,接口或者enum声明 *   FIELD:域(属性)声明 *   METHOD:方法声明 *   PARAMETER:参数声明 *   CONSTRUCTOR:构造方法声明 *   ANNOTATION_TYPE:注释类型声明 *   PACKAGE:包声明 * 2、@Rentation: 表示需要在什么级别保存该注解信息。RetentionPolicy的枚举类型如下: *   SOURCE:注解将被编译器丢弃 *   CLASS:注解将会被编译至class文件中,但在运行时jvm不保留 *   RUNTIME:运行时保留注解 * 3、@Documented:此注解将包含在javadoc中 * @author yujin */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface HelloClass {	String value() default "helloClass";}

注解方法代码

package com.yujin.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 定义方法注解 * @author Administrator */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface HelloMethod {    String name();}

com.yujin.action包下类

package com.yujin.action;import com.yujin.annotation.HelloClass;import com.yujin.annotation.HelloMethod;@HelloClass(value="roleAction")public class RoleAction {		@HelloMethod(name="addRole")	public void addRole(){		System.err.println("addRole()-------------------");	}	public void listRoles(){		System.err.println("listRoles()-------------------");	}	public void addRoleUI(){		System.err.println("addRoleUI()-------------------");	}		@HelloMethod(name="editRole")	public void editRole(){		System.err.println("editRole()-------------------");	}		public void editRoleUI(){		System.err.println("editRoleUI()-------------------");	}		@HelloMethod(name="deleteRole")	public void deleteRole(){		System.err.println("editRoleUI()-------------------");	}}
package com.yujin.action;import com.yujin.annotation.HelloClass;import com.yujin.annotation.HelloMethod;@HelloClass(value="helloAction")public class HelloAction {		@HelloMethod(name="addUser")	public void addUser(){		System.err.println("addUser()-------------------");	}	public void listUsers(){		System.err.println("listUsers()-------------------");	}	public void addUserUI(){		System.err.println("addUserUI()-------------------");	}		@HelloMethod(name="editUser")	public void editUser(){		System.err.println("editUser()-------------------");	}		public void editUserUI(){		System.err.println("editUserUI()-------------------");	}		@HelloMethod(name="deleteUser")	public void deleteUser(){		System.err.println("editUserUI()-------------------");	}}

测试类(主要是获得注解的类和方法)

java测试

package com.yujin.test;import java.io.File;import java.io.FilenameFilter;import java.lang.reflect.Method;import com.yujin.annotation.HelloClass;import com.yujin.annotation.HelloMethod;public class TestAnnotation {		/**	 * 通过包名获取所有类	 * @param pname	 * @return	 */	public static String[] getClassByPackage(String pname) { //通过包名获取所有类		String pr = pname.replace(".", "/");		String pp = TestAnnotation.class.getClassLoader().getResource(pr).getPath();		File file = new File(pp);		String[] fs = file.list(new FilenameFilter() {			@Override			public boolean accept(File dir, String name) {				if(name.endsWith(".class")) return true;				return false;			}		});		return fs;	}		public static void init(String pname){        try {			String [] strs = getClassByPackage("com.yujin.action");			for(String p : strs){				String pc = pname+"."+p.substring(0,p.lastIndexOf(".class"));				//得到了类的class对象				Class clz = Class.forName(pc);				if(!clz.isAnnotationPresent(HelloClass.class)) continue;				System.err.println("************"+clz.getName()+"*************");				//获取每个类中的方法,以此确定哪些角色可以访问哪些方法				Method[] methods = clz.getDeclaredMethods();				 //因为是注解到method上的,所以首先要获取这个方法  			    for(Method method : methods){			    	if(method.isAnnotationPresent(HelloMethod.class)){ //有注解			    		HelloMethod helloMethod = method.getAnnotation(HelloMethod.class);			    		if(helloMethod != null){			    			System.err.println("注解:"+method.getName()+"---name:"+helloMethod.name());			    		}			    	}else{			    		System.err.println("没注解:"+method.getName());			    	}			    }			}		} catch (ClassNotFoundException e) {			e.printStackTrace();		} catch (SecurityException e) {			e.printStackTrace();		}	}	public static void main(String[] args) {				init("com.yujin.action");    }}

java web 测试

public class HelloWorld implements ApplicationListener
 {     Logger logger = LoggerFactory.getLogger(HelloWorld.class);     @Override    public void onApplicationEvent(ContextRefreshedEvent event) {        logger.debug("------初始化执行----");        try {            // 获取上下文            ApplicationContext context = event.getApplicationContext();            // 获取所有beanNames            String[] beanNames = context.getBeanNamesForType(Object.class);            for (String beanName : beanNames) {                                     HelloClass helloClass = context.findAnnotationOnBean(beanName,                        HelloClass.class);                //判断该类是否含有HelloClass注解                      if (helloClass != null) {                    Method[] methods = context.getBean(beanName).getClass()                            .getDeclaredMethods();                    for (Method method : methods) {                            //判断该方法是否有HelloMethod注解                        if (method.isAnnotationPresent(HelloMethod.class)) {                            HelloMethod helloMethod = method                                    .getAnnotation(HelloMethod.class);                            String id = helloMethod.id();                            String name = helloMethod.name();                            // do something                            logger.debug("注解方法:" + method.getName() + "," + id                                    + "," + name);                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}

转载于:https://my.oschina.net/u/1754093/blog/604165

你可能感兴趣的文章
《Haskell趣学指南》—— 第2章,第2.2节Haskell的常见类型
查看>>
从多租户隔离到高可用,谈DaoShip微服务架构演进
查看>>
14. Html5的局:WebGL的纹理格式
查看>>
java 多线程和线程池
查看>>
开源大数据周刊-第26期
查看>>
莫让“专业对口”俘虏了你
查看>>
Java端实现RedisPUB/SUB(订阅发布)
查看>>
113期:电子书《阿里巴巴技术实战2016年刊》重磅发布,免费下载!
查看>>
Material Design学习之 Camera
查看>>
云栖社区
查看>>
Angular.js Services
查看>>
Java使用SSLSocket通信
查看>>
iOS开发之深复制和浅复制
查看>>
jar包启动与停止
查看>>
IMP-00003: ORACLE error 3113 encountered ORA-03113: end-of-file on communication channel
查看>>
角色和权限Hibernate实体映射配置
查看>>
为什么用 PostgreSQL 绑定变量 没有 Oracle pin S 等待问题
查看>>
折腾Openoffice---解决中文和注册问题(原创)
查看>>
获取request和response
查看>>
[LeetCode] Sort List
查看>>