本文全面介绍了Java Annotation注释、Java自定义注释及相关内容,大家可以仔细看看。
一:Java注解简介
开发中经常用到注释,项目中偶尔会遇到自定义注释。今天我们就来讨论一下这个标注到底是个什么鬼,标注的应用场景,以及如何自定义标注。
下面列举开发中常见的注解
@Override:用于标识该方法继承自超类。当父类的方法被删除或修改时,编译器会提示错误信息(在我们最常看到的toString()方法上总能看到这个产品)
@Deprecated:表示此类或此方法已被弃用并已过期。如果用户仍然想使用它,将生成一个编译好的警告。
@SuppressWarnings:要忽略的编译器警告
Junit测试:@Test
Spring的一些评论:@Controller、@RequestMapping、@RequestParam、@ResponseBody、@Service、@Component、@Repository、@Resource、@Autowire
Java验证的注释:@NotNull,@Email
让我们来看看注解Override.java的真实面目。
@Target(ElementType。方法)
@保留(RetentionPolicy。来源)
公共@接口覆盖{
}
二:Java注解基本知识
1. Java注解数据类型
评论写在。java文件,使用@Interface作为关键字,所以注释也是Java的一种数据类型。从广义的定义来看,类、接口、枚举和注释都属于类类型。
2.Java元注释
在创建标注的时候,需要用一些标注来描述自己的标注,也就是那些写在@interface上的标注。这些标注称为元标注,如@Target、@Retention等。如Override中所示。以下是一些元评论。
@ Documented:用于标记生成javadoc时是否包含注释。可见这个评论和@Override一样,是空的,什么都没有。
@已记录
@保留(RetentionPolicy。运行时间)
@Target(ElementType。批注_类型)
public @interface已记录{
}
@Target:用于定义注释可以用在哪里。默认情况下,它们可以在任何地方使用或指定使用范围。在开发中对类(如@Controller)、字段(如@Autowire)、方法(如@RequestMapping)和方法的参数(如@RequestParam)使用注释是很常见的。
类型:类、接口或枚举声明
字段:域(属性)声明
方法:方法声明
参数:参数声明
构造函数:构造函数方法声明
局部变量:局部变量声明
ANNOTATION_TYPE:注释类型声明
包:包声明
Target.java
@已记录
@保留(RetentionPolicy。运行时间)
@Target(ElementType。批注_类型)
public @interface目标{
/**
*返回批注类型的元素种类的数组
*可适用于。
* @返回批注类型的元素种类数组
*可应用于
*/
element type[]value();
}
公共枚举元素类型{
/**类、接口(包括批注类型)或枚举声明*/
类型,
/**字段声明(包括枚举常量)*/
场,
/**方法声明*/
方法,
/**形参声明*/
参数,
/**构造函数声明*/
构造者,
/**局部变量声明*/
局部变量,
/**批注类型声明*/
批注_类型,
/**包声明*/
包装,
/**类型参数声明*/
类型参数,
/**类型的使用*/
类型_用途
}
@Inherited:允许子类从父类继承注释,通过反射从父类获取注释。
@已记录
@保留(RetentionPolicy。运行时间)
@Target(ElementType。批注_类型)
继承的public @ interface
}
@Constraint:用于检查属性值是否合法。
@已记录
@Target({ElementType。批注_类型})
@保留(RetentionPolicy。运行时间)
public @interface约束{
班级?扩展ConstraintValidator?[]validated by();
}
@Retention:注释的声明期用来定义注释的生存阶段,可以生存在源代码级、编译级(字节码级)、运行时级。
源代码:源代码级别,注释只存在于源代码中,一般用于与编译器交互和检测代码。比如@Override,@SuppressWarings。
类:字节码级别,注释存在于源代码和字节码文件中,主要用于生成附加文件,如XML、Java文件等。但它们不能在运行时获得。例如,mybatis生成实体和映射文件。这个级别需要在JVM加载时添加javaagent,使用代理动态修改字节码文件。
运行时:运行时级别。注释存在于源代码、字节码和java虚拟机中,主要用于运行时。您可以使用反射来获取相关信息。
@已记录
@保留(RetentionPolicy。运行时间)
@Target(ElementType。批注_类型)
公共@接口保留{
/**
*返回保留策略。
* @返回保留策略
*/
RetentionPolicy值();
}
3.Java注释的内容
在上面的注释源代码中,可以看到有的注释没有内容,有的注释有内容,看起来像方法。
注释内容的语法格式:数据类型属性名()默认默认值,数据类型用来描述属性的数据类型,默认值是指没有给属性赋值时使用默认值。通常,字符串使用空字符串。“”作为默认值,数组一般使用空数组{}作为默认值。
我们来看看SpringMVC中RequestMapping的注释的语句。
@Target({ElementType。方法,ElementType。类型})
@保留(RetentionPolicy。运行时间)
@已记录
@映射
public @interface请求映射{
字符串名称()默认为“”;
@AliasFor('path ')
String[] value()默认值{ };
@AliasFor('value ')
String[] path()默认{ };
RequestMethod[]方法()默认{ };
string[]params()default { };
String[] headers()默认值{ };
String[]消耗()默认值{ };
字符串[]产生()默认值{ };
}
在SpringMVC中使用RequestMapping注释
@RequestMapping(value='/list ',
方法=请求方法。帖子,
produces={ ' application/JSON;charset=UTF-8;'})
公共字符串列表(){
}
4.注释的使用场景
可以通过注释的声明周期来分析注释的使用场景:
源代码级:由编译器使用,如@Override、@Deprecated等。这部分开发者要用的场景并不多。
类:字节码级别,这也很少见。
运行时:运行时级别,这是最常见的。几乎所有开发人员使用的注释都是运行时级别的,运行时注释通常用于以下情况。
注释中没有任何属性的空注释。这部分评论通常起到一个标记的作用,比如@测试、@之前、@之后。通过获得这些标记的注释,逻辑上完成了一些特殊的处理。
可以使用约束注释@Constraint来检查属性值,比如@Email、@NotNull等。
您可以通过在注释中使用属性来配置一些参数,然后您可以使用反射来获取这些参数。这些注释没有其他特殊功能,只是简单的代替xml配置来配置一些参数。使用注释配置参数在Spring boot中很流行,比如@Configuration。
关于配置模式xml vs annotation,xml一般用于配置一些与业务不密切相关的配置,annotations用于配置一些与业务密切相关的参数。
三:Java注解和反射基本API
//获取某种注释
public A扩展了Annotation A get Annotation(class A Annotation class);
//获取所有注释(包括在父类中继承的注释)
公共批注[]get annotations();
//获取声明的注释(但不是父类中由Inherited修饰的注释)
公共批注[]getDeclaredAnnotations();
//确定对象是否由批注标记。
public boolean isanotationpresent(类。扩展注释annotationClass)
//获取类声明的所有字段
公共字段[] getDeclaredFields()引发SecurityException
//获取一个方法
公共方法getMethod(字符串名,类?参数类型);
四:自定义评论
您可以通过使用自定义注释拦截器或AOP来控制权限。
下面定义了一个注释来限制用户在访问界面时必须登录的示例。
步骤一:定义注解
RequiresLogin.java
@已记录
@Target({ElementType .方法})
@保留(保留政策.运行时间)
公共@接口需要登录{
}
步骤二:使用注解
@控制器
@RequestMapping('/user ')
公共类用户控制器{
@要求登录
@RequestMapping(value='/list ',produces={ ' application/JSON;charset=UTF-8;'})
公共字符串getUserList(){
系统。出去。println('-');
返回[{'id': 1,'用户名':'张三' }]';
}
}
步骤三:使用面向切面编程进行拦截,解析注解
公共类逻辑设备{
公共void before(连接点连接点)引发异常{
对象目标=连接点。get target();
字符串方法名=连接点。获取签名().getName();
系统。出去。println(目标'-'方法名);
方法method=target.getClass().get方法(方法名);
布尔注释存在=方法。isannotationpresent(需要登录。类);
if (annotationPresent) {
//用户必须登录
布尔isLogin=false
如果(!isLogin) {
抛出新异常('访问该接口必须先登录');
}否则{
System.out.println('已登录.');
}
}
}
}
在应用程序上下文.可扩展标记语言中配置面向切面编程(面向方面的编程的缩写)
bean id='登录设备' class=' com。孟迪。经理。AOP。登录设备'/
!- aop配置-
AOP:config proxy-target-class=' true '
!-切面-
aop:方面引用=' loginAdvices '
!-切点-
AOP:切入点id='切入点1 '表达式='执行(* com。蒙迪。经理。控制器。*。*(.))'/
!-连接通知方法与切点-
AOP:before method=' before '切入点-ref='切入点1 '/
/aop:方面
/aop:config
自定义异常
为什么要自定义异常
Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)虽然提供了丰富的异常处理类,但是在项目中还会经常使用自定义异常,其主要原因是Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)提供的异常类在某些情况下还是不能满足各种业务的需求。例如系统中有些错误是符合Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)语法,但不符合业务逻辑。如当用户登录时账号不存在或者账号已锁定可以自定义一个账号异常帐户异常.
或者有些情况下Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的同一个异常可能会有多种原因引起,在排查问题时不容易定位错误,此时可以使用自定义一个更加明确的异常。
自定义异常的好处:自定义异常可以使异常更加明确,可以隐藏底层的异常,这样更安全,异常信息更加直观。
自定义异常的使用:自定义异常一般继承自例外或者RuntimeException,根据业务需要可以带一些属性作为构造函数的参数,自定义异常需要程序员手动抛出异常,并处理异常。
下面是阿帕奇希罗中自定义异常的示例
公共类Shiro例外扩展RuntimeException {
公共ShiroException() {
}
公共ShiroException(字符串消息){
超级(消息);
}
公共ShiroException(可引发的原因){
超(因);
}
公共ShiroException(字符串消息,可抛出原因){
超级(消息,原因);
}
}
以上即是关于Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)注解注释与自定义注解的详细说明
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。