这两天想搭一个纯粹使用注解的ssm框架,于是就看了看mybatis注解的使用方式,但是感觉java中底层注解平时不常使用都忘得差不多了,于是就重新看了一遍.
这里简单记录下1.Java中开发自定义注解类,2.自定义注解类的使用,3.自定义注解类的解析
一.自定义注解类开发
?
class="java">package com.star.frame.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Name { String id () default "1"; String value() default ""; int len() default 100; String[] properties() default {"p1","p2"}; Class<? extends Object> type() default String.class; }
?
?
理解:1.注解类与接口相似,里面只能定义静态常量和抽象方法;它与接口,枚举,类属于同一层次,都被称作一种类型。
? ? ? ? ? 2.java底层中提供的注解有两种:(1)常用的基本注解:@SuppressWarnings,@Deprecated,@Override(2)元注解:@Retention,@Target
? ? ? ? ? 3.注解类的使用范围由@Retention决定,分三种:
RetentionPolicy.SOURCE:指定注解只保留在源文件当中,编译成类文件后就把注解去掉。
RetentionPolicy.CLASS:指定注解只保留在源文件和编译后 class 文件中,当jvm加载类时就把注解去掉。
RetentionPolicy.RUNTIME:指定注解可以保留在jvm中,这样就可以使用反射获取信息了。
默认保留在类中文件中,所以使用时一般要指定保存到RetentionPolicy.RUNTIME中
? 4.可以使用注解的元素类型由@Target决定,分为以下几种:
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前
不写则默认可以使用于所有元素类型。
二.自定义注解类的使用
package com.star.frame.annotation; public class Use { @Name(id="name1",len=50,properties={"a","b"},value="test") public boolean getName(String id,int len ,String[] properties,String value){ System.out.println(id); System.out.println(len); System.out.println(properties[0]+properties[1]); System.out.println(value); return true; } }
?理解:注解的使用方法:
? ? ? ? 1.@注解名:一般使用于有默认值的注解
? ? ? ? 2.@注解名(方法名=方法返回值) :使用于没有默认值的注解,此时必须制定值
? ? ? ? 3.@注解名(方法名=方法返回值,方法名={返回值1,返回值2}) :使用于方法返回数组类型的注解
? ? ? ? 4.@注解名(返回值) :使用于只有value方法的注解,可以只写返回值
?
三.自定义注解类的解析
public class Parse { public void parseMethod(Class clzz) throws Exception{ Object o = clzz.getConstructor(new Class[]{}).newInstance(new Object[]{}); Method[] methods = clzz.getDeclaredMethods(); for (Method method : methods) { Name nameClzz = method.getAnnotation(Name.class); if(nameClzz != null){ String id = nameClzz.id(); String value = nameClzz.value(); int len = nameClzz.len(); String[] props = nameClzz.properties(); Class< ? extends Object> clz = nameClzz.type(); method.invoke(o,id,len,props,value); } } } }
?理解:当解析注解的时候,一般通过getAnnotation 或 getAnnotations 来获取类,方法,属性的注解类。从而使用反射进行处理
?
以上就是对于java注解使用方法的简单总结,此中有些理解的用法是参考一些博客总结出来的,作为自己的积累使用。
?
?
?
?