java自定义注解

Java 自定义注解 Java自定义注解Java注解简介Java元注解自定义注解代码演示 本章点知识总览: 1、Java 注解简介 2、Java 元注解(重点) 3、自定义注解 4、Aop 自定义注解的应用(重点) Java注解(Annotation) 分类 编程技术 Java注解(Annotation)又称Java标注,是JDK5.0约会的一种注释机制。 和Javadoc不同,Java标注可以通过反射获取标注内容。 ... 阅读详情
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Inherited允许子类继承父类中的注解
 * @Documented注解表明制作javadoc时,
 * 是否将注解信息加入文档。如果注解在声明时使用了@Documented,
 * 则在制作javadoc时注解信息会加入javadoc。
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}


@Target (目标,靶子...)

public enum ElementType {
    /** 类、接口(包括注释类型)或枚举声明 */
    TYPE,

    /** 字段声明(包括枚举常量) */
    FIELD,

    /** 方法声明 */
    METHOD,

    /** 正式的参数声明 */
    PARAMETER,

    /** 构造函数声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注释类型声明 */
    ANNOTATION_TYPE,

    /** 程序包声明*/
    PACKAGE,

    /**
     * 类型参数声明
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 使用类型
     *
     * @since 1.8
     */
    TYPE_USE
}
@Retention

表示需要再什么级别保存该注解信息,可选的RetentionPolicy参数包括:

SOURCE:注解将被编译器丢弃。

CLASS:注解再class文件中可用,但会被VM丢弃。

RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息。

 

利用AOP对方法级别的注解做相应的操作

package com.fun.utils;

import com.fun.client.domain.MemUserInfo;
import com.fun.client.domain.OperationLog;
import com.fun.client.service.MemUserInfoService;
import com.fun.client.service.OperationLogService;
import com.fun.framework.support.BusinessException;
import com.fun.framework.utils.RequestUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Aspect
@Component
public class LogAspect {
   /* @Autowired
    private SysLogDao sysLogDao;*/
   @Autowired
   private MemUserInfoService memUserInfoService;
   @Autowired
   private OperationLogService operationLogService;

    @Pointcut("@annotation(com.fun.utils.Log)")
    public void pointcut() { }
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) throws Exception {
        Object result = null;
        long beginTime = System.currentTimeMillis();
        try {
            // 执行方法
            result = point.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        // 执行时长(毫秒)
      //  long time = System.currentTimeMillis() - beginTime;
        // 保存日志
        saveLog(point);
        return result;
    }
    private void saveLog(ProceedingJoinPoint joinPoint) throws Exception {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        OperationLog operationLog  = new OperationLog ();

        Log logAnnotation = method.getAnnotation(Log.class);
        if (logAnnotation != null) {
            // 注解上的描述
            operationLog.setContent(logAnnotation.value());
        }
//获取当前用户ID(Security框架)
        int userId = NumberUtils.toInt(SecurityContextHolder.getContext().getAuthentication().getName());
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        String ip = null ;
        //String ipAddress;
        try {
            if (userId >= 1) {
        //获取当前用户登录真实IP(RequestUtils获取当前登陆者ip等信息工具类下章有写)
                 ip = RequestUtils.getIp(request);
                    //解析IP为地址
               //  ipAddress = RequestUtils.getIpAddress(ip);
                   //登录浏览器类别
               // String agent = RequestUtils.getAgent(request);
                //  this.memService.addLoginLog(userId, ip, ipAddress, agent);
            }
        } catch (Exception ex2) {
        }
        //插入数据到数据库
        MemUserInfo memUserInfo = memUserInfoService.selectById(userId);
        operationLog.setMemberId(userId);
        operationLog.setMemberName(memUserInfo.getLoginName());
        operationLog.setOperationIp(ip);
        operationLog.setMemberRemark(memUserInfo.getRemark());
        operationLogService.insert(userId,operationLog);
    }
}

 

机器视觉/将HIK海康面阵相机连接Halcon软件 本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。 阅读详情

相关推荐

深入浅出CenterFusion

结合论文和代码理解CenterFusion

Untitled的专栏 5101

Java自定义注解

注解分类(根据Annotation是否包含成员变量,可以把Annotation分为两类):标记Annotation:没有成员变量的Annotation;这种Annotation仅利用自身的存在与否来提供信息元数据Annotation:包含成员变量的Annotation;它们可以接受(和提供)更多的元数据;

weixin_67450855的博客 1万+

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 225

Java实现自定义注解

Java实现自定义注解其实很简单,跟类定义差不多,只是属性的定义可能跟我们平时定义的属性略有不同,实现自定义注解需要最少指定两个基本条件:①注解的作用范围②注解的生命周期,那这两个范围怎么指定呢?这个问题问的很好,指定这两个条件,就需要使用到了Java为我们提供的元注解(所谓的元注解:其实就是Java自定义的注解,并且为这个注解赋予了含义,当编译器扫描到这个注解时,就知道该注解是什么作用!)

个人学习博客,不足之处,还望不吝赐教! 1万+

SAP 财务快速记账之—G/L Item Fast Entry

SAP FICO 运维解决方案

lijinbao171022的博客 1646

告别Overleaf!本地LaTeX环境配置:VSCode+TeXLive完全指南(Windows/Mac双平台)

本文详细介绍了如何在Windows和Mac平台上配置本地LaTeX环境,使用VSCode和TeXLive打造高效的专业写作工作流。从TeXLive安装到VSCode插件配置,再到高级技巧与性能优化,帮助用户摆脱Overleaf限制,实现更快速、更私密的学术写作体验。

3c4x5z6v7b的博客 952

JAVA实现自定义注解

该注解功能最为强大,其所标注的方法用于编写包裹业务模块执行的代码,通知的第一个参数必须是 ProceedingJoinPoint 类型。,@Pointcut切点表达式非常丰富,可以将 方法(method)、类(class)、接口(interface)、包(package) 等作为切入点,非常灵活,常用的有@annotation、@within、execution等方式,上面的示例使用的是@annotation方式,意思就是说被Spring扫描到方法上带有@annotation中的注解 就会执行切面通知。

weixin_46155048的博客 1万+

手把手教你用LIO-SAM搞定激光雷达和IMU联合标定(附避坑指南)

本文详细介绍了使用LIO-SAM进行激光雷达与IMU联合标定的全流程,包括标定原理、工具选型、硬件配置、数据采集、LI_calib标定步骤及LIO-SAM集成验证。特别提供了避坑指南和参数优化技巧,帮助开发者高效完成传感器标定,提升自动驾驶和机器人定位精度。

hadoop5ranger的博客 995

java自定义注释

1、自定义注释的介绍 2、定义注释类型@interface 3、添加注释的成员变量 4、设置默认值 5、设置目标范围@Target 6、设置保持性@Retention @Retention(RetentionPolicy.SOURCE) public @Interface Test{ int number() degault 1; String value(); String description() default "OK"; } 这使得test注释符只能在java源代码中保持

zouyang920的博客 435

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1546

JAVA自定义注解

根据注解是否包含成员变量,可以分为如下两类: 1、标记注解:没有定义成员变量的注解类型被称为标记注解。这种注解仅利用自身的存在与否来提供信息,如前面介绍的 @Override、@Test 等都是标记注解。 2、元数据注解:包含成员变量的注解,因为它们可以接受更多的元数据,所以也被称为元数据注解。

一个喜欢诗和远方的程序媛 4067

【STM32系统】基于STM32+手机APP设计的智能停车场系统

功能简介1、进出停车场时需要刷卡,进行一个记时、计费的功能。2、停车位配有超声波检测,主要识别车位是否被占用。3、车位区域配有OLED显示屏,用户可以通过显示屏看到空闲车位。4、车位配有车位灯。当用户找不到车位可以通过手机点亮车位灯5、停车场配有温湿度检测和烟雾检测模块。当环境发生异常状态。会触动紧急报警。6、停车场信息会通过Wi-Fi发送数据上传至阿里云。用户可以通过手机了解到停车场空闲车位和停车时间、费用。

嵌入式阿齐Archie 2万+

Java中的注解以及自定义注解

1、Annotation(注解) 概述 (1)、注解起到标识做用,比如Junit的@Test注解。 Junit会在运行时检查方法上是否存在此注解,如果存在,就通过反射来运行你的方法。注意标红的反射两个字,反射在注解里相当重要,写完你的自定义注解类后没啥用,必须要用反射才能让它动起来!所以需要对反射有了解,感兴趣的小可爱可以看下这篇:Java中的反射机制介绍 (2)、从 JDK 5.0 开...

曹举的个人博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java注解以及自定义注解

Java注解以及自定义注解

YIYIYI 1968

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java自定义注解开发

一、JAVA注解 1、java注解的定义 Java注解是附加在代码中的一些元信息,用于一些工具在编译、 运行时进行解析和使用,起到说明、配置的功能。 注解相关类都包含在java.lang.annotation包中。 2、java注解的分类 2.1 JDK基本注解 2.1.1 @Override 重写 2.1.2 @Deprecated 已过时 2.1.3 @SuppressWarnings(value = ...

zxy15974062965的博客 7173

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java中自定义注解的使用

Java中自定义注解的使用

weixin_45565886的博客 3466

java如何自定义注解

一、什么是注解? 注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。 二、自定义注解需要的基本元素 自定义注解需要用到的东西: 修饰符:访问修饰符必须为public,不写默认为pubic; 关键字:关键字为@interface; 注解名称: 注解名称为自定义注解的名称,使用时还会用到; 注解类型元素: 注解类型元素是注解中内容,可以理解成自定义接口的

m0_58680865的博客 4767

Java注解,元注解,自定义注解的使用

自定义注解,需要使用@interface来定义,使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口。权限修饰符 @interface 注解名 {// 定义内容 String value() default "";// 参数类型 参数名 默认值;@interface 用来声明一个注解其中上面的表示这个注解需要提供一个String类型的参数,且其默认值为空字符串default ""value() 就是参数的名称。

m0_63622279的博客 1909

【注解】Java自定义注解

Java注解(Annotation)又称为Java标注,是Java 5开始支持加入源代码的特殊语法元数据。是附加在代码上的一些元信息,可以用于添加元数据、配置或行为到代码中,支持自定义注解,是一个强大的功能,自定义注解的实现包括定义注解、处理注解(通过反射或注解处理器)以及在实际代码中使用注解。注解相关类都包含在java.lang.annotation包中。自定义注解使用@interface关键字定义。

GM_115的博客 1020

Java的自定义注解

Java的自定义注解是一种元数据,可以应用于类、方法、字段等程序元素上,以提供额外的信息或指示。自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息;元注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应的逻辑。自定义注解在编写框架、插件等开发时非常常见,可以为代码提供更多的灵活性和可扩展性。

阿水的博客 1917

java自定义注解封装已有注解_Java实现自定义注解

Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优雅。本文将先从自定义注解的基础概念说起,然后开始实战,写小段代码实现自定义注解+拦截器,自定义注解+AOP。一. 什么是注解(Annotation)Java注解是什么,以下是引用自维基百科的内容Java注解又称Java标注,是JDK5.0版本开始支持加入源代码的特殊语法元数据。Java...

weixin_39596975的博客 1039
上一篇: Java手机验证码
下一篇: Java获取IP
sike_java
博客等级 码龄9年 16粉丝 25原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值