一个案例带你掌握“注释”的使用

《JAVA啃骨头》之 Java SE 章节

一个案例带你掌握“注释”的使用

package com.bjpowernode.java.annotation; //Annotation 注解
//带有注解的类,注解的使用:在需要注解的类的前面用@注解类型名
//注解是一种引用数据类型,编译后,生成class字节码文件
@MustHasIdPropertyAnnotation
public class User {
	int id;
	String name;
	String password;
}

———————————————————

package com.bjpowernode.java.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 这是一个注解,里面有两个元注解,元注解:注解注解的注解。元注解有
很多,常用的这两个。

// 表示这个注解只能出现在类上面
@Target(ElementType.TYPE)
// 该注解可以被反射机制读取到,并且被保存在class文件中。
@Retention(RetentionPolicy.RUNTIME)
public @interface MustHasIdPropertyAnnotation {

}
// 这个注解 @MustHasIdPropertyAnnotation用来标注类,被标注的类中
必须有一个int类型的id属性,没有就报异常。
//通常来说,注解里面是应该写 *属性* 的,并且在使用的时候,给属性
 *赋值*,
 eg:
 //定义注解
 package com.bjpowernode.java.annotation1;
 public @interface MyAnnotation {
 String name();
  //使用注解
package com.bjpowernode.java.annotation1; 
 public class MyAnnotationTest {
 @MyAnnotation(name = "zhangsan", color = "红色")
 public void doSome(){

}

———————————————————

package com.bjpowernode.java.annotation;
/*
SUN提供的JDK内置的异常肯定是不够的用的。在实际的开发中,有很多业务,
这些业务出现异常之后,JDK中都是没有的。和业务挂钩的。
自定义异常:
    第一步:编写一个类继承Exception或者RuntimeException.
    第二步:提供两个构造方法,一个无参数的,一个带有String参数的。
 */
public class HasNotIdPropertyException extends RuntimeException {
	 public HasNotIdPropertyException(){

    }
	public HasNotIdPropertyException(String s){
    super(s);
    }
}

———————————————————

package com.bjpowernode.java.annotation;
import java.lang.reflect.Field;

//通过反射机制获取被注解修饰的类的注解,并判断注解属性是否为int类型的id属性。
public class Test {
public static void main(String[] args) throws Exception{
    // 获取类
    Class userClass = Class.forName("com.bjpowernode.java.annotation7.User");
    // 判断类上是否存在Id注解
    if(userClass.isAnnotationPresent(MustHasIdPropertyAnnotation.class)){
        // 当一个类上面有@MustHasIdPropertyAnnotation注解的时候,要求类中必须存在int类型的id属性
        // 如果没有int类型的id属性则报异常。
        // 获取类的属性
        Field[] fields = userClass.getDeclaredFields();
        boolean isOk = false; // 给一个默认的标记
        for(Field field : fields){
            if("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())){
                // 表示这个类是合法的类。有@Id注解,则这个类中必须有int类型的id
                isOk = true; // 表示合法
                break;
            }
        }

        // 判断是否合法
        if(!isOk){
            throw new HasNotIdPropertyException("被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!");
        }

    }
}
}
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页