javase-annotation-210710-02

javase-annotation-210710-02

  • 注解中可以用的属性类型
  • 反射获取类上的注解
  • 反射获取类中方法上的注解
  • 注解实例

注解中可以用的属性类型

MyAnnotation0301.java
package bgy_annotation_02;

public @interface MyAnnotation0301 {

    /*
        注解当中的属性可以是哪种类型
            byte  short  int  long  float  double  boolean  char  String  Class  enum(枚举类型)
            以及上面的每种的数组形式
     */
    int value01();
    int[] value0101();

    String value02();
    String[] value0202();

    Season value03();
    Season[] value0303();

    Class value04();
    Class[] value0404();
}
MyAnnotation0302.java
package bgy_annotation_02;

public @interface MyAnnotation0302 {

    // 年龄属性
    int age();

    // 邮箱地址属性,支持多个
    String[] email();
}
MyAnnotation0303.java
package bgy_annotation_02;

public @interface MyAnnotation0303 {

    // 年龄属性
    int age();

    // 邮箱地址属性,支持多个
    String[] email();

    // 季节属性
    Season[] seasonArray();
}
Season.java
package bgy_annotation_02;

public enum Season {
    SPRING,SUMMER,AUTUMN,WINTER;
}
AnnotationTest03.java
package bgy_annotation_02;

public class AnnotationTest03 {

    // 数组是 {} 花括号
    @MyAnnotation0302(age = 22,email = {"1111111111@qq.com","baiguangyi@souhu.com"})
    public void doSome(){

    }

    // 如果数组中只用一个元素,花括号{} 可以省略
    @MyAnnotation0303(age = 22,email = "123456789@qq.com",seasonArray = {Season.SPRING,Season.AUTUMN})
    public void doOther(){

    }
}

反射获取类上的注解

MyAnnotation0401.java
package bgy_annotation_03;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
    只允许该注解可以标注类,方法
    这个注解可以被反射
 */
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation0401 {

    String value() default "河南";
}
MyAnnotationTest04.java
package bgy_annotation_03;

@MyAnnotation0401
public class MyAnnotationTest04 {

    @MyAnnotation0401
    public void doSome(){

    }
}
AnnotationTest04.java
package bgy_annotation_03;
/*
    获取类上面的注解信息
 */

public class AnnotationTest04 {
    public static void main(String[] args) throws Exception {

        // 获取类
        Class myAnnotationTest04Class = Class.forName("bgy_annotation_03.MyAnnotationTest04");

        // 判断这个类上面是否有@MyAnnotation0401这个注解
//        System.out.println(myAnnotationTest04Class.isAnnotationPresent(MyAnnotation0401.class));  // true
        if (myAnnotationTest04Class.isAnnotationPresent(MyAnnotation0401.class)){
            // 获取该注解对象
            MyAnnotation0401 myAnnotation0401 = (MyAnnotation0401) myAnnotationTest04Class.getAnnotation(MyAnnotation0401.class);
//            System.out.println("类上面的注解对象为:"+myAnnotation0401);  // @bgy_annotation_03.MyAnnotation0401(value=河南)
            // 获取注解对象的属性
            String value = myAnnotation0401.value();
            System.out.println("注解对象value属性的值为:"+value);  // 注解对象value属性的值为:河南
        }

        // 判断String类上是否有@MyAnnotation0401这个注解
//        Class stringClass = Class.forName("java.lang.String");
//        System.out.println(stringClass.isAnnotationPresent(MyAnnotation0401.class));  // false
    }
}

反射获取类中方法上的注解

MyAnnotation0501.java
package bgy_annotation_04;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotation0501 {

    String username();

    String password();
}
AnnotationTest05.java
package bgy_annotation_04;
/*
    获取类 方法 上的注解信息
 */

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class AnnotationTest05 {

    @MyAnnotation0501(username = "bgy",password = "123")
    public void doSome(){

    }

    public static void main(String[] args) throws Exception {

        // 获取AnnotationTest05上doSome()方法的注解信息
        // 获取这个类
        Class annotationTest05Class = Class.forName("bgy_annotation_04.AnnotationTest05");
        // 获取doSome方法
        Method doSomeMethod = annotationTest05Class.getMethod("doSome");
        // 判断这个方法是否有@MyAnnotation0501这个注解
        if (doSomeMethod.isAnnotationPresent(MyAnnotation0501.class)) {
            MyAnnotation0501 annotation = doSomeMethod.getAnnotation(MyAnnotation0501.class);
            System.out.println(annotation.username());
            System.out.println(annotation.password());
        }
    }
}

注解实例

要求:
	有一个叫  @Id  的注解
	这个注解只能在类上面出现,
	当这个类有@Id注解的时候,要求这个类中必须有一个int类型的id属性,
	如果没有这个属性就报异常,
	如果有这个属性则正常运行。
Id.java
package bgy_annotation_05;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 这个注解只能出现在类上面,可以被反射机制读取到
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ID {

}
User.java
package bgy_annotation_05;
@ID
public class User {
    int id;
    String name;
    String password;
}
HasNotIdPropertyException.java
package bgy_annotation_05;
/*
    自定义异常
 */
public class HasNotIdPropertyException extends RuntimeException {
    public HasNotIdPropertyException() {
    }

    public HasNotIdPropertyException(String message) {
        super(message);
    }
}
AnnotationTest06.java
package bgy_annotation_05;
/*
    注解在程序中等同于一种标记
 */

import java.lang.reflect.Field;
public class AnnotationTest06 {
    public static void main(String[] args) throws Exception {

        // 获取类
       Class userClass = Class.forName("bgy_annotation_05.User");

       // 判断User类上是否有@Id注解
        if (userClass.isAnnotationPresent(ID.class)) {
            // 当一个类上面都有@Id注解的时候,要求类中必须有int类型的id属性
            // 如果没有int类型的id属性则报异常
            boolean flag = false;
            // 获取类的属性
            Field[] fields = userClass.getDeclaredFields();
            for (Field field : fields) {
                if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) {
                    // 表示这个类合法,有@Id注解,则这个类中必须有int类型id
                    flag = true;
                    break;
                }
            }

            if (!flag) {
                throw new HasNotIdPropertyException("被@Id注解标记的类中必须要有一个int类型的id属性");
            }
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值