zoukankan      html  css  js  c++  java
  • Java基础学习12--注解

    1.注解相关概念

    注解(Annotation)是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件。

    可以通过反射技术得到类的注解,以控制类的运行方式。

    创建注解使用@interface关键字,注解中只能包含属性。

    注解的属性可以使用的类型:字符串、基本数字类型、Class、Enum、Annotation,以上类型的一维数组。

    2.创建注解

    1 package com.example.anno;
    2 
    3 public @interface MyAnnotation {
    4     //只能包含属性
    5     String name();
    6     
    7     int age() default 18;
    8 }
     1 package com.example.anno;
     2 
     3 import com.example.eum.Gender;
     4 
     5 public @interface MyAnnotation2 {
     6     String value();
     7     
     8     int num() default 2;
     9     
    10 //    Class<?> class1();
    11 //    
    12 //    Gender gender();
    13 //    
    14 //    MyAnnotation anno1();
    15 }
     1 package com.example.anno;
     2 
     3 //注解写在类上
     4 @MyAnnotation(name = "张三", age = 20)
     5 public class Person {
     6     
     7     //注解写在方法上,使用默认值
     8     @MyAnnotation(name = "张三")
     9     public void show() {
    10         
    11     }
    12     
    13     @MyAnnotation2(value="鸡肉")    
    14     public void eat() {
    15         
    16     }
    17 }

    注解的本质是一个继承了Annotation的interface,注解的属性会被转换为方法。

    3.使用反射获取注解信息

     1 package com.example.anno;
     2 
     3 import java.lang.annotation.ElementType;
     4 import java.lang.annotation.Retention;
     5 import java.lang.annotation.RetentionPolicy;
     6 import java.lang.annotation.Target;
     7 
     8 //元注解,
     9 //@Retention(RetentionPolicy.CLASS)// 默认,运行的时候注解就不存在了
    10 @Retention(RetentionPolicy.RUNTIME) // jvm级别
    11 //@Retention(RetentionPolicy.SOURCE) // 编译时直接丢弃
    12 
    13 @Target(value = { 
    14         ElementType.ANNOTATION_TYPE,
    15         ElementType.CONSTRUCTOR,
    16         ElementType.FIELD,
    17         ElementType.LOCAL_VARIABLE,
    18         ElementType.METHOD,
    19         ElementType.PACKAGE,
    20         ElementType.TYPE,
    21         ElementType.TYPE_PARAMETER,
    22         ElementType.TYPE_USE })
    23 
    24 public @interface PersonInfo {
    25     String name();
    26 
    27     int age();
    28 
    29     String sex();
    30 }
     1 package com.example.anno;
     2 
     3 //注解写在类上
     4 @MyAnnotation(name = "张三", age = 20)
     5 public class Person {
     6 
     7     // 注解写在方法上,使用默认值
     8     @MyAnnotation(name = "张三")
     9     public void show() {
    10 
    11     }
    12 
    13     @MyAnnotation2(value = "鸡肉")
    14     public void eat() {
    15 
    16     }
    17 
    18     @PersonInfo(name = "张三", age = 20, sex = "男")
    19     public void show(String name, int age, String sex) {
    20         System.out.println(name + "--" + age + "--" + sex);
    21     }
    22 }
     1 package com.example.anno;
     2 
     3 import java.lang.annotation.Annotation;
     4 import java.lang.reflect.Method;
     5 
     6 public class Demo {
     7 
     8     public static void main(String[] args) throws Exception {
     9         // TODO Auto-generated method stub
    10         Class<?> cp = Class.forName("com.example.anno.Person");
    11         Method m = cp.getMethod("show", String.class, int.class, String.class);
    12         PersonInfo pi = m.getAnnotation(PersonInfo.class);
    13         System.out.println(pi.name() + "--" + pi.age() + "--" + pi.sex());
    14 
    15         Person p = (Person) cp.newInstance();
    16         m.invoke(p, pi.name(), pi.age(), pi.sex());
    17     }
    18 }
  • 相关阅读:
    异常处理——Java的try catch用法
    C# 如何通过mailto标签和SMTP协议两种方式发送邮件
    Sublime Text 插件之HTML-CSS-JS Prettify—格式化HTML CSS JS与显示函数列表
    C# 如何提取字符串中的数字
    C# 解决读取dbf文件,提示Microsoft Jet 数据库引擎找不到对象的问题
    解决UEFI启动模式下无法使用U盘启动WIN7安装界面
    实现Windows直接远程访问Ubuntu 18.04(旧版本也支持,无需安装第三方桌面,直接使用自带远程工具)
    深度学习(TensorFlow)环境搭建:(三)Ubuntu16.04+CUDA8.0+cuDNN7+Anaconda4.4+Python3.6+TensorFlow1.3
    深度学习(TensorFlow)环境搭建:(二)Ubuntu16.04+1080Ti显卡驱动
    xrdp完美实现Windows远程访问Ubuntu 16.04
  • 原文地址:https://www.cnblogs.com/asenyang/p/14385978.html
Copyright © 2011-2022 走看看