Annotation入门

转载自:http://www.iteye.com/topic/234330

 

2.注释
2.1 什么是元数据
2.2 JDK中内置的注释.
2.3 自定义注释
2.3.1 注释的种类
2.3.2 适用的位置
2.3.3 关于参数列表

最近一段时间在整理关于JDK5新特性的资料.发出来与各位分享.如果哪里有问题请指正.谢谢

2.1 什么是元数据:元数据被描述为定义数据的数据.比如我拍一张照片.照片本身是我需要的主体数据.但如果我想知道这张照片是什么时候拍摄的那我的数码相机可以帮我添上年月日时分秒.那对于照片本身来讲这个时间就是描述他的元数据.
JAVA中的元数据(注释)主要用于生成文档,检查代码,或者为运行时需要的功能提供数据.
JAVA中的注释分为两块---数据的提供者数据的使用者
数据提供者就是我们经常使用的方式.比如这样一个注释@Author(name="yh")我们只提供了这样一个数据并不知道程序会拿他来做什么.
数据使用者是分析这些数据并提供操作的家伙.它得到@Author注释.并且可以得到name属性中的数据,然后用于生成文档或者做其他事情.这些对于数据提供者来说完全是透明的.

2.3 自定义注释:
自定义注释长啥样:

Java代码 复制代码
  1. @Target({ElementType.Method})   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. public @interface MyAnnotation{   
  4.     public String name() default "yh";   
  5. }  
@Target({ElementType.Method})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    public String name() default "yh";
}


简单解释一下上面的注释.
@Target:一个标注注释的注释.也可以说是注释的元数据.作用是标注MyAnnotation的适用地点这里标注为方法.也就是说MyAnnotation只能用于标示方法.
我们看一下Target的声明

Java代码 复制代码
  1. @Documented  
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. @Target(ElementType.ANNOTATION_TYPE)   
  4. public @interface Target {   
  5.     ElementType[] value();   
  6. }  
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}


他接受一个ElementType数组作为参数.说明注释的使用范围可以是多个地点.

Java代码 复制代码
  1. @Target({ElementType.METHOD,ElementType.TYPE})  
@Target({ElementType.METHOD,ElementType.TYPE})


我们把MyAnnotation的声明改为即可以使用在方法上也可以用于类.接口.枚举上
下面是ElementType的原码以及各种类所应用的范围;

Java代码 复制代码
  1. public enum ElementType {   
  2.        TYPE, // 适用 class, interface, enum   
  3.        FIELD, // 适用 field   
  4.        METHOD, // 适用 method   
  5.        PARAMETER, // 适用 method 上之 parameter   
  6.        CONSTRUCTOR, // 适用 constructor   
  7.        LOCAL_VARIABLE, // 适用区域变量   
  8.        ANNOTATION_TYPE, // 适用 annotation 型态   
  9.        PACKAGE // 适用 package   
  10. }  
 public enum ElementType {
        TYPE, // 适用 class, interface, enum
        FIELD, // 适用 field
        METHOD, // 适用 method
        PARAMETER, // 适用 method 上之 parameter
        CONSTRUCTOR, // 适用 constructor
        LOCAL_VARIABLE, // 适用区域变量
        ANNOTATION_TYPE, // 适用 annotation 型态
        PACKAGE // 适用 package
 }


Java代码 复制代码
  1. @Retention(RetentionPolicy.RUNTIME)  
@Retention(RetentionPolicy.RUNTIME)


标示MyAnnotation将被保存到什么时候RetentionPolicy.RUNTIME会告诉编译器.我这个注视要保存到CLASS文件中并且我会再运行时通过JAVA反射来使用他.
下面是RetentionPolicy的原码以及各种类所应用的范围;

Java代码 复制代码
  1. public enum RetentionPolicy {   
  2.    SOURCE,        //编译器处理完Annotation信息后就没事了,也不会被保存在字节码中.   
  3.    CLASS,        //编译器将Annotation储存于class档中.   
  4.    RUNTIME        //编译器将Annotation储存于class檔中,可由JVM读入   
  5. }  
public enum RetentionPolicy {
   SOURCE,        //编译器处理完Annotation信息后就没事了,也不会被保存在字节码中.
   CLASS,        //编译器将Annotation储存于class档中.
   RUNTIME        //编译器将Annotation储存于class檔中,可由JVM读入
}



下面的代码演示了如何在运行时找到注释并得到数据.

Java代码 复制代码
  1. public class MyAnnotationDemo {   
  2.   
  3.     //我想在这里标注作者信息   
  4.     @MyAnnotation(name = "JE")  //如果不写参数默认是yh,这是default地作用   
  5.     public void getAnnotationDemo(){   
  6.   
  7.     }   
  8.   
  9.     public static void main(String[] args) {   
  10.         Class clazz = MyAnnotationDemo.class;   
  11.         Method[] methods = clazz.getMethods();   
  12.         for(Method m : methods) {   
  13.             if(m.isAnnotationPresent(MyAnnotation.class)){   
  14.                 MyAnnotation ann = m.getAnnotation(MyAnnotation.class);   
  15.                 System.out.println("MethodName = " + m.getName());   
  16.                 System.out.println("name = " + ann.name());   
  17.                 System.out.println("ann.age() = " + ann.age());   
  18.             }   
  19.         }   
  20.     }   
  21. }  
public class MyAnnotationDemo {

    //我想在这里标注作者信息
    @MyAnnotation(name = "JE")  //如果不写参数默认是yh,这是default地作用
    public void getAnnotationDemo(){

    }

    public static void main(String[] args) {
        Class clazz = MyAnnotationDemo.class;
        Method[] methods = clazz.getMethods();
        for(Method m : methods) {
            if(m.isAnnotationPresent(MyAnnotation.class)){
                MyAnnotation ann = m.getAnnotation(MyAnnotation.class);
                System.out.println("MethodName = " + m.getName());
                System.out.println("name = " + ann.name());
                System.out.println("ann.age() = " + ann.age());
            }
        }
    }
}

 

基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值