一、什么叫java注解
注释,说白了,注释,便是对某一事情开展添加注释表明,会储放一些信息,这些数据很有可能对将来某一时间段而言还是非常有用处。Java注释也叫java标注,java带来了一套体制,促使我们能对方法、类、主要参数、包、域及其自变量等加上规范(即另附一些信息内容)。且在日后某一时间段根据反射面将注明的数据抓取出去以便应用。
二、自定Java标注
1为何要自定义注解
Java从1.5版本号之后默认设置内嵌三个标明:
@Override:可以用在方式之上的,用于让别人知道这一个方法是什么改变成员变量的。
@Deprecated:提议他人尽量不要用老旧API时用的,编译程序的时候就会用造成警告信息,能够设定为程序流程中的每一个原素上.
@SuppressWarnings:这一个种类能来临时把一些警告信息信息关掉.
可是,只是这三个标明是无法满足大家开发设计时一些的需求。因此java容许大家自定义注解来用。
2怎样自定义注解
自定流程主要分为二步:1),根据@interface关键词(留意,不是interface,是@interace)申明注释名字,及其注释中的一员特性或是称为注释的主要参数。2),使用java内嵌的四个元注释对于这个自定注明的性能和范畴进行一些限定那么问题来了,什么叫元注释?
3什么叫元注释
元注释,便是界定注释的注解,换句话说这种元注释是的作用是专门用于管束其他注释的注解。请差别上边那三个注释,她们都是通过元注释界定而成的。元注释都有哪些呢,主要包括四个@Target,@Retention,@Documented,@Inherited
元注释有:@Target,@Retention,@Documented,@Inherited
@Target表明该注释用以哪些地方,可能性的ElemenetType主要参数包含:
ElemenetType.CONSTRUCTOR构造器申明
ElemenetType.FIELD域申明(包含enum案例)
ElemenetType.LOCAL_VARIABLE静态变量申明
ElemenetType.METHOD方式申明
ElemenetType.PACKAGE包申明
ElemenetType.PARAMETER主要参数申明
ElemenetType.TYPE类,插口(包含注释种类)或enum申明
@Retention表示在什么级别储存该注释信息内容。可供选择的RetentionPolicy主要参数包含:
RetentionPolicy.SOURCE注释要被编译程序丢掉
RetentionPolicy.CLASS注释在class文件中可以用,却会被VM丢掉
RetentionPolicy.RUNTIMEVM将于运行期也保存注解,因而能通过反射机制载入注释的数据。
@Documented将这一注释包含于javadoc中
@Inherited容许子类继承父类里的注释
4自定和使用注释实例
自定一个类级别标明Description
packagelighter.javaeye.com;
importjava.lang.annotation.Documented;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Target(ElementType.TYPE)//这一标明用于类
@Retention(RetentionPolicy.RUNTIME)//标明会一直保存到运行中
@Documented//将这一注释包含于javadoc中
public@interfaceDescription{
Stringvalue();
}
再定义个方法级别注释Name
packagelighter.javaeye.com;
importjava.lang.annotation.Documented;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
//留意这儿的@Target与@Description里的差异,主要参数组员也不尽相同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceName{
Stringoriginate();
Stringcommunity();
}
随后应用上述2个注释
packagelighter.javaeye.com;
@Description(value="javaeye,做最出色的开发软件交流社区")
publicclassJavaEyer{
@Name(originate="创办人:robbin",community="javaEye")
publicStringgetName()
{
returnnull;
}
@Name(originate="创办人:江南白衫",community="springside")
publicStringgetName2()
{
return"使用二位的cd一用,写这一个事例,请见谅!";
}
}
表明:在其中标明“@Description(value=“javaeye,做最出色的开发软件交流社区”)”,能够写出“@Description(“javaeye,做最出色的开发软件交流社区”)”,结论也是一样的。由于Description标明界定时其主要参数(换句话说特性)为value。而value比较特别,它被特定主要参数的时候也可以无需标注的表达出来。不过如果界定时参数名不是value反而是其他的例如des,那样应用注释时,务必表明写下参数名,然后取值:@Description(Des=”xxx”)
获取出注释的数据
packagelighter.javaeye.com;
importjava.lang.reflect.Method;
importjava.util.HashSet;
importjava.util.Set;
publicclassTestAnnotation{
/**
*authorlighter
*表明:实际关天Annotation的API用法请参阅javaDoc文档
*/
publicstaticvoidmain(String[]args)throwsException{
StringCLASS_NAME="lighter.javaeye.com.JavaEyer";
Classtest=Class.forName(CLASS_NAME);
Method[]method=test.getMethods();
booleanflag=test.isAnnotationPresent(Description.class);
if(flag)
{
Descriptiondes=(Description)test.getAnnotation(Description.class);
System.out.println("叙述:"+des.value());
System.out.println("—————–");
}
//把JavaEyer这一类有运用到@Name的所有方式储存到Set中来
Setset=newHashSet();
for(inti=0;i{
booleanotherFlag=method[i].isAnnotationPresent(Name.class);
if(otherFlag)set.add(method[i]);
}
for(Methodm:set)
{
Namename=m.getAnnotation(Name.class);
System.out.println(name.originate());
System.out.println("建立的小区:"+name.community());
}
}
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/292174.html