自定义注解、数字字典注解
创始人
2024-03-31 18:37:04

目录

一、基本注解

二、自定义注解及使用

 三、注解日志


一、基本注解

@Retention:定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)             //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)              //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)            //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)
@Target(ElementType.TYPE)                      //接口、类
@Target(ElementType.FIELD)                     //属性
@Target(ElementType.METHOD)                    //方法
@Target(ElementType.PARAMETER)                 //方法参数
@Target(ElementType.CONSTRUCTOR)               //构造函数
@Target(ElementType.LOCAL_VARIABLE)            //局部变量
@Target(ElementType.ANNOTATION_TYPE)           //注解
@Target(ElementType.PACKAGE)                   //包
注:可以指定多个位置,例如:
@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用

@Inherited:指定被修饰的Annotation将具有继承性

@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.

注解分类(根据Annotation是否包含成员变量,可以把Annotation分为两类):

标记Annotation:
没有成员变量的Annotation; 这种Annotation仅利用自身的存在与否来提供信息

元数据Annotation:
包含成员变量的Annotation; 它们可以接受(和提供)更多的元数据;

二、自定义注解及使用

 如我定义一个注解 myAnotaion1

package com.zking.ssm.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 11:12* 定义注解myAnotaion1*/
//类,方法,属性
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface myAnotaion1 {public  String value() default "value修饰类、方法、属性";//内容public  String desc() default "desc修饰类、方法、属性";//内容}

 myAnotaion2

package com.zking.ssm.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 11:12* 定义注解myAnotaion1*/
//类,方法,属性
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface myAnotaion2 {public  String value() default "value修饰类、方法、属性";//内容public  String desc() default "desc修饰类、方法、属性";//内容}

 注解使用

package com.zking.ssm.annotation;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 11:17*/
@myAnotaion1(value = "标记在类上面")
public class StudentController {//标记注解@myAnotaion1( "标记在属性id上面")private  String id;@myAnotaion1("标记在属性name上面")private String name;@myAnotaion2public  void test(@myAnotaion2("用来修饰id参数") String id,@myAnotaion2("用来修饰name参数")String name){System.out.println("测试");}}

测试

package com.zking.ssm.demo;import com.zking.ssm.annotation.StudentController;
import com.zking.ssm.annotation.myAnotaion1;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 11:48* 目标:* 1.获取 StudentController 类上的自定义注解中的内容*1.获取 StudentController 方法上的自定义注解中的内容* 1.获取 StudentController 属性上的自定义注解中的内容* 1.获取 StudentController 参数上的自定义注解中的内容*/public class Demo3 {public static void main(String[] args) {
1.获取 StudentController 类上的自定义注解中的内容//获得自定义注解myAnotaion1myAnotaion1 anotaion=StudentController.class.getAnnotation(myAnotaion1.class);System.out.println(anotaion.value());System.out.println(anotaion.desc());}}

 

 报错原因:改为

@Retention(RetentionPolicy.RUNTIME)


//        2.获取 StudentController 属性上的自定义注解中的内容
//     获取属性
       Field id= StudentController.class.getDeclaredField("id");
        Field name= StudentController.class.getDeclaredField("name");
//      拿到内容
        System.out.println(id.getAnnotation(myAnotaion1.class).value());
        System.out.println(name.getAnnotation(myAnotaion1.class).value());


 

 //  3.获取 StudentController 方法上的自定义注解中的内容
Method m1= StudentController.class.getDeclaredMethod("test", String.class, String.class);System.out.println(m1.getAnnotation(myAnotaion2.class).value());

 

//        4.获取 StudentController 参数上的自定义注解中的内容
//       获取方法Method m1= StudentController.class.getDeclaredMethod("test", String.class, String.class);
//获取方法上的参数Parameter[] ps= m1.getParameters();for (Parameter parameter : ps) {System.out.println(parameter.getAnnotation(myAnotaion2.class).value());}

 


 三、注解日志

 定义注解:Mylog

p定义ackagecom.zking.ssm.Aop;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 15:16*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {String desc();}

 DemoController

package com.zking.ssm.Aop;import com.zking.ssm.Aop.MyLog;
import org.springframework.stereotype.Controller;/*** @author 锦鲤* @site www.lucy.com* @company xxx公司* @create  2022-10-27 15:14*/
@Controller
public class DemoController {@MyLog(desc = "方法的内容")public  void test(){System.out.println("测试方法");}
}

 MyLogAspect  日志文件

package com.zking.ssm.Aop;import com.zking.ssm.Aop.MyLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** @author 锦鲤* @site www.lucy.com*/
@Component
@Aspect
public class MyLogAspect {private static final Logger logger = LoggerFactory.getLogger(MyLogAspect.class);/*** 只要用到了com.javaxl.p2.annotation.springAop.MyLog这个注解的,就是目标类*/@Pointcut("@annotation(com.zking.ssm.Aop.MyLog)")private void MyValid() {}@Before("MyValid()")public void before(JoinPoint joinPoint) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();logger.debug("[" + signature.getName() + " : start.....]");System.out.println("[" + signature.getName() + " : start.....]");MyLog myLog = signature.getMethod().getAnnotation(MyLog.class);logger.debug("【目标对象方法被调用时候产生的日志,记录到日志表中】:"+myLog.desc());System.out.println("【目标对象方法被调用时候产生的日志,记录到日志表中】:" + myLog.desc());}
}

 测试ClazzBizTest

package com.zking.shiro;import com.zking.ssm.Aop.DemoController;
import com.zking.ssm.biz.ClazzBiz;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @author小李飞刀* @site www.javaxl.com* @company xxx公司* @create  2022-10-26 15:29*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class ClazzBizTest {/*  @Autowiredprivate ClazzBiz clazzBiz;
*/@Autowiredprivate DemoController demoController;
@Test
//    demoControllerpublic  void test1(){demoController.test();//调用}}


相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...