问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中自定义注解详解?

发布网友 发布时间:2024-09-30 20:19

我来回答

1个回答

热心网友 时间:2024-10-21 01:24

java自定义的注解有什么作用

自定义注解,可以应用到反射中,比如自己写个小框架。

如实现实体类某些属性不自动赋值,或者验证某个对象属性完整性等

本人自己用过的验证属性值完整性:

@Target(ElementType.FIELD)???

@Retention(RetentionPolicy.RUNTIME)

public?@interface?IgnoreProperty?{

}

然后实体类中:

public?class?TarResearch?implements?Serializable{

?@IgnoreProperty

?private?static?final?long?serialVersionUID?=?1L;

?@IgnoreProperty

private??Integer?researchId;

?@IgnoreProperty

?private?TarUser?userId;

?private?String?version;

?private?String?grade;

....

???}?

然后action类中??

//?验证数据完整性

??ClassTarResearch??userClass?=?TarResearch?.class;

??Field[]?field?=?userClass.getDeclaredFields();

??for?(int?i?=?0;?i??field.length;?i++)?{

???if?(field[i].getAnnotation(IgnoreProperty.class)?!=?null)?{

????continue;

???}

???String?fie?=?field[i].getName().substring(0,?1).toUpperCase()

?????+?field[i].getName().substring(1);

???Method?method?=?userClass.getMethod("get"?+?fie);

???Object?obj?=?method.invoke(u);

???if?(obj?==?null)?{

????sendResponseMsg(response,?"数据错误");

????return?null;

???}

??}

如何创建,使用以及解析自定义注解

首先要想使用自定义注解,必须创建自己的注解类

右键项目,new-Annotation

然后在注解里定义自己的方法,该方法是别的类使用注解时需要填的属性

packagecom.sy.demo.annotation;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)@Documentedpublic@interfaceTable{publicStringvalue();}

注:如果只有一个方法时,应该用value()来指定方法名,这样就可以直接简写@Table("xxx")而不是@Table(aaa="xxx");

其中注解类上的注解称为元注解

@Target(ElementType.TYPE)

@Target的意思是,该注解类是放在什么位置的,是放在类上、字段上还是方法上,ElementType.TYPE意思是只能放在类上或接口上,ElementType.FIELD意思是只能放在字段上等等。

如果有多个位置选择可以这么写:

@Target({ElementType.TYPE,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

意思是作用域,一般写RUNTIME就行

@Documented

意思是是否在生成JavaDoc时加入该注解类,这个看情况写不写

还有其他元注解,想要研究的就自己研究吧

定义完自定义注解了,下面就是使用的时候了

packagecom.sy.demo.entity;importcom.sy.demo.annotation.Column;importcom.sy.demo.annotation.Table;@Table("tdb_user")publicclassUser{@Column("id")privateLongid;@Column("email")privateStringemail;@Column("password")privateStringpassword;publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}

在这里我定义了一个实体类,用于表示用户信息,其中还是用了一个@Column类,代码如下

packagecom.sy.demo.annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceColumn{publicStringvalue();}

由代码可知,@Column是放在field上的

使用也使用完了,下面该是解析的时候了。

packagecom.sy.demo.util;importjava.lang.reflect.Field;importcom.sy.demo.annotation.Column;importcom.sy.demo.annotation.Table;publicclassSqlUtil{privatestaticfinalStringEMPTY="";@SuppressWarnings("unchecked")publicstaticStringgetSql(Objectobject){StringBuildersb=newStringBuilder();ClassObjectc;booleanisExist;Columncolumn;StringcolumnName;StringgetMethodName;ObjectcolumnValue;String[]strs;try{c=(ClassObject)object.getClass();isExist=c.isAnnotationPresent(Table.class);if(!isExist){returnEMPTY;}Tabletable=c.getAnnotation(Table.class);sb.append("SELECT*FROM"+table.value()+"WHERE1=1");Field[]fields=c.getDeclaredFields();for(Fieldfield:fields){isExist=field.isAnnotationPresent(Column.class);if(!isExist){continue;}column=field.getAnnotation(Column.class);columnName=column.value();getMethodName="get"+columnName.substring(0,1).toUpperCase()+columnName.substring(1);columnValue=c.getMethod(getMethodName,newClass[0]).invoke(object,newObject[0]);if(columnValue==null){continue;}if(columnValueinstanceofString){columnValue=(String)columnValue;if(((String)columnValue).contains(",")){sb.append("AND"+columnName+"IN(");strs=((String)columnValue).split(",");for(Stringstr:strs){sb.append("'"+str+"',");}sb.deleteCharAt(sb.length()-1);sb.append(")");}else{sb.append("AND"+columnName+"='"+columnValue+"'");}}elseif(columnValueinstanceofInteger||columnValueinstanceofLong){sb.append("AND"+columnName+"="+columnValue+"");}}}catch(Exceptione){e.printStackTrace();}returnsb.toString();}}

解析的时候用的是反射机制,可能看着比较麻烦比较乱,而且也新手可能也不太理解,在用的时候会发现其实还是挺方便的。

原理解释根据反射找到User类,在判断是否有注解,接着拼接sql什么的

整个列子项目中完整的代码如下(有许多步骤测试用例,懒得删了,全贴出来吧)

Controller

packagecom.sy.demo.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importcom.sy.demo.entity.User;importcom.sy.demo.service.IUserService;@Controller@RequestMapping("hello")publicclassUserController{@AutowiredprivateIUserServicehService;@RequestMapping(value="demo1")publicStringdemo1(){return"demo1";}@SuppressWarnings("deprecation")@RequestMapping(value="demo2")publicStringdemo2(){returnhService.test();}@RequestMapping(value="demo3")@ResponseBodypublicStringdemo3(){Useruser=newUser();user.setId(1L);user.setEmail("mr_songyang1990@163.com");user.setPassword("1q2w3e4r,123456,aaaaa");returnhService.getUser(user);}@RequestMapping(value="demo4")@ResponseBodypublicStringdemo4(){Useruser=newUser();user.setId(1L);user.setEmail("mr_songyang1990@163.com");user.setPassword("1q2w3e4r,123456,aaaaa");returnhService.getUser2(user);}}

service:

packagecom.sy.demo.service;importcom.sy.demo.entity.User;publicinterfaceIUserService{@DeprecatedpublicStringtest();publicStringgetUser(Useruser);publicStringgetUser2(Useruser);}

packagecom.sy.demo.service.impl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importcom.sy.demo.entity.User;importcom.sy.demo.repository.IUserRepository;importcom.sy.demo.service.IUserService;@Service("hService")publicclassUserServiceImplimplementsIUserService{@AutowiredprivateIUserRepositoryhRepository;@Deprecated@OverridepublicStringtest(){return"demo2";}@OverridepublicStringgetUser(Useruser){returnhRepository.queryUser(user);}@OverridepublicStringgetUser2(Useruser){returnhRepository.queryUser2(user);}}

Repository

packagecom.sy.demo.service.impl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importcom.sy.demo.entity.User;importcom.sy.demo.repository.IUserRepository;importcom.sy.demo.service.IUserService;@Service("hService")publicclassUserServiceImplimplementsIUserService{@AutowiredprivateIUserRepositoryhRepository;@Deprecated@OverridepublicStringtest(){return"demo2";}@OverridepublicStringgetUser(Useruser){returnhRepository.queryUser(user);}@OverridepublicStringgetUser2(Useruser){returnhRepository.queryUser2(user);}}

packagecom.sy.demo.repository.impl;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importorg.springframework.stereotype.Repository;importcom.sy.demo.entity.User;importcom.sy.demo.repository.IUserRepository;importcom.sy.demo.util.DBUtil;importcom.sy.demo.util.SqlUtil;@Repository("hRepository")publicclassUserRepositoryImplimplementsIUserRepository{publicStringqueryUser(Useruser){Stringsql=SqlUtil.getSql(user);System.out.println(sql);returnsql;}@OverridepublicStringqueryUser2(Useruser){StringBuildersb=newStringBuilder();Stringsql=SqlUtil.getSql(user);System.out.println(sql);PreparedStatementps=DBUtil.getPreparedStatement(sql);Longid;Stringemail;Stringpassword;try{ResultSetrs=ps.executeQuery();while(rs.next()){id=rs.getLong("id");email=rs.getString("email");password=rs.getString("password");sb.append("ID:").append(id).append(",email:").append(email).append(",password:").append(password).append("br/");}}catch(SQLExceptione){e.printStackTrace();}returnsb.toString();}}

entity:

packagecom.sy.demo.entity;importcom.sy.demo.annotation.Column;importcom.sy.demo.annotation.Table;@Table("tdb_user")publicclassUser{@Column("id")privateLongid;@Column("email")privateStringemail;@Column("password")privateStringpassword;publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}

annotation

packagecom.sy.demo.annotation;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)@Documentedpublic@interfaceTable{publicStringvalue();}

packagecom.sy.demo.annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceColumn{publicStringvalue();}

util工具类

packagecom.sy.demo.util;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importcom.mysql.jdbc.jdbc2.optional.MysqlDataSource;publicclassDBUtil{publicstaticfinalStringURL="jdbc:mysql://localhost:3306/db_test";publicstaticfinalStringUSERNAME="root";publicstaticfinalStringPASSWORD="root";publicstaticConnectionconn=null;publicstaticMysqlDataSourcedataSource;static{dataSource=newMysqlDataSource();dataSource.setUser(USERNAME);dataSource.setPassword(PASSWORD);dataSource.setURL(URL);}publicstaticPreparedStatementgetPreparedStatement(Stringsql){try{conn=dataSource.getConne

Java 注解的工作原理以及如何创建自定义注解

创建自定义注解步骤包括:定义注解类型,应用到代码,以及处理(编译时或运行时)以实现特定功能。关键内置注解- @Override - @Deprecated - @SuppressWarnings - @FunctionalInterface - 元注解如@Retention和@Target 内置注解的影响内置注解不仅是元数据,它们影响代码行为,如编译验证和运行时反射。理解并有...

java注解工作原理?

1)、定义一个最简单的注解 public@interfaceMyAnnotation{ //...} 2)、把注解加在某个类上:MyAnnotation publicclassAnnotationTest{ //...} 以下为模拟案例 自定义注解@MyAnnotation 1packagecom.ljq.test;2 3importjava.lang.annotation.ElementType;4importjava.lang.annotation.Retention;5importj...

java 自定义的注解有什么作用

自定义注解,可以应用到反射中,比如自己写个小框架。如实现实体类某些属性不自动赋值,或者验证某个对象属性完整性等 本人自己用过的验证属性值完整性:Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME)public @interface IgnoreProperty {}然后实体类中:public class TarResearch implements ...

java注解是怎么实现的

Java注解是以“@”符号开头的特殊语法结构,用于为代码添加元数据。这些元数据可以在编译时或运行时被处理。开发者可以自定义注解,并通过注解处理器对标注的代码进行特殊处理。二、注解的实现原理 1. 元数据:注解的本质是元数据,即描述数据的数据。在Java中,元数据是存储在类文件中的,可...

java 帮我看下这几个注解是什么意思 谢谢了

CONSTRUCTOR:用于描述构造器2.FIELD:用于描述域3.LOCAL_VARIABLE:用于描述局部变量4.METHOD:用于描述方法5.PACKAGE:用于描述包6.PARAMETER:用于描述参数7.TYPE:用于描述类、接口(包括注解类型) 或enum声明 四:@interface interface是用来自定义JAVA Annotation的语法,普通的开发人员可能很少用到它,但是它的...

java自定义的注解类里面一定要有value方法吗

不用。只是说如果有value方法的话,在使用这个注解的时候,不用显示的给value赋值。比如定义了一个注解如下:public @interface AnnoTest { int value();}在使用的时候,可以简写成:@AnnoTest(1)而不用像这样写:@AnnoTest(value = 1)最后,欢迎关注公众号:JavaHi ...

Java学习9_注解

通过在项目编译路径中添加JUnit相关jar包,引入JUnit框架,实现单元测试的自动化。在下载和安装JUnit时,需注意选择适合项目的版本,并确保正确导入相关包。进行单元测试时,需要满足一定条件,如使用@Test注解标注测试方法。此外,可以自定义测试模板,以适应不同的测试需求,提高测试效率。

Java高并发编程实战5,异步注解@Async自定义线程池

Async注解的作用是异步处理任务。在使用@Async时,如果不指定线程池的名称,默认线程池是Spring默认的线程池SimpleAsyncTaskExecutor。默认线程池的配置如下:从最大线程数可以看出,在并发情况下,会无限制地创建线程。也可以通过yml重新配置:也可以自定义线程池,下面通过简单的代码来实现@Async自定义线程池...

java事务注解?

java开发时怎么自动添加注解通过菜单Window-Preference打开参数设置面板,然后选择:Java-CodeStyle-CodeTemplates在右侧选择Comments,将其中的Files项,然后选右边的Edit,进入编辑模式:进入编辑模式后就可以自定义注释了。打开Windows-Preferences-Java-CodeStyle-CodeTemplates,点击右边窗口中的Comments,可以看到...

如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参...

接下来,我们来定义一个日志注解,如下所示:源代码如下:到这里,一个完整的自定义注解就定义完成了。四、配置 AOP 切面 在配置 AOP 切面之前,我们需要了解一些 aspectj 相关注解的作用。定义好切点后,我们可以围绕这个切点进行操作。接下来,定义一个 WebLogAspect.java 切面类,并声明一个切点。然后...

java开发中的注解自定义详解 java自定义注解怎么实现注解 java自定义注解使用场景 java项目使用自定义注解 java自定义注解枚举类型 java扫描自定义注解 java自定义注解做参数校验 Java自定义注解 java被注解上的注解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
乾隆的夜壶是什么做的?拜托各位大神 云便签如何设置在桌面显示便签内容 云便签怎么设置在桌面显示便签内容... 手机root是什么意思中文翻译(手机root是什么意思) 入手了韩版k版,什么都还好.究竟能不能root vivo v3ma究竟怎么才能root? 把所有的root软件都用了一遍,全部root失败... 金价什么时候会涨 是vivox5 max的八核好还是vivoxshot的四核好 vivox5和vivoxshot哪个性比价高 vivoxshot和x5哪个配置高哪个内存大? vivo手机otg连接上没反应?? 怎样在下拉选项中添加空白选项 怎样在excel中输入下拉选项? 怎样在Excel中设置下拉选项? word里空白下划线换行怎么消失了word2007空白下划线 2022汉川中考录取分数线是多少? 如何回复别人的赞扬才不会让自己尴尬呢? 感谢同事的赞美怎么回复 为什么空气开关老是会跳闸? 家里的空气开关为什么经常跳闸? 一个人的情商是指什么情商简称以及含义 800米训练方法,大概两个星期内,八月二十六号就要运动会了。急用!_百度... 我是一个胖子 跑个几百米就累死了 但是明天就体育考试了 怎么办 希尔顿什么卡 希尔顿会员有什么用 网易账号被恶意绑定 关于CCIE的问题. 亚历山大帝国属于希腊还是罗马 高中时会考没过老师没给毕业证 、 现在要急用 、 大学同学说会考不过... 苹果6屏幕亮度太暗怎么办? 皇竹草和甜象草哪个好 电脑关机后,直接重启了怎么办啊? 苹果4s的siri支持中文吗? 如何在手机上设置手机淘宝店铺介绍? 安卓手机淘宝店铺店招怎么设置呢? 什么去油脂效果最好 电脑开机时强制关机然后就这样了,怎么办? 电脑卡住了然后我强制关机,然后就这样了 笔记本死机了然后强制关机重启就这样了,谁能告诉我该怎么办啊!急急急... 喝过期茶叶的危害 怎么判断茶叶是不是过期的呢 喝过期茶叶的危害,密封的过期茶叶能喝吗 过期茶叶的危害 电脑死机了 然后我强制关机 就这样了 求帮忙 手提电脑来的 求帮忙 请问喝过期茶叶有些什么危害 小米手机运行内存越来越少怎么清理 饮用过期茶叶危害健康(过期的茶叶喝了有什么危害) 强制关机后在开机就这样了。我的是笔记本电脑Acer,如果要打开bios,怎 ... 电脑强制关机后就这样了 强制关机了一次就这样了,请问该咋办 《心灵奇旅》是一部怎样的电影? 豆瓣9.0高分电影《心灵奇旅》:这是一封给普通人的情书