java注解

注解:在包、类、变量、方法、参数上添加的注释标签。注解标签可以随着代码进行编译,运行期间可以获取到,可以对程序进行一些标注作用。

1、内置注解

java中已经定义好的,直接使用。

@Override  //java定义好的,直接使用

@Override - 标注该方法是从父类中重写过来的,编译器就要检测语法,是否与父类中方法结构一致

@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

@FunctionalInterface 用于指示被修饰的接口是函数式接口。

@SuppressWarnings - 指示编译器去忽略注解中声明的警告。

2、元注解

定义注解的注解

java注解_第1张图片

@Target - 表示注解的作用范围

  • ElementType.TYPE 可以应用于类的任何元素。
  • ElementType.CONSTRUCTOR 可以应用于构造函数。
  • ElementType.FIELD 可以应用于字段或属性。
  • ElementType.LOCAL_VARIABLE 可以应用于局部变量。
  • ElementType.METHOD 可以应用于方法级注释。
  • ElementType.PACKAGE 可以应用于包声明。
  • ElementType.PARAMETER 可以应用于方法的参数

@Retention - 注解在什么时候生效

  • SOURCE:在源文件中有效(即源文件保留)
  • CLASS:在 class 文件中有效(即字节码保留)
  • RUNTIME:在运行时有效(即运行时保留)

@Documented - 标记这些注解是否包含在用户文档中。

@Inherited - 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类)

@Repeatable - 标识某注解可以在同一个声明上使用多次。

@Target(ElementType.METHOD) //注解可以作用在哪些元素上
@Retention(RetentionPolicy.SOURCE) //注解什么时候生效

3、自定义注解

package com.ffyc.javapro.javaAnnotation;

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


@Target(ElementType.FIELD)//作用在类的属性上
@Retention(RetentionPolicy.RUNTIME)//运行时生效
public @interface NotNull {
	String message() default "";	
	int length() default 0;	
	String lengthmessage() default "";
}
package com.ffyc.javapro.javaAnnotation;

public class User {
	private int num;

	@NotNull(message="姓名不能为空",length=3,lengthmessage="长度不能小于3")
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
}
package com.ffyc.javapro.javaAnnotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class Test {

  public static void main(String[] args) throws NoSuchMethodException, SecurityException, Exception {
      User user = new User();
      user.setName("jiim");

      //对类中的注解标签进行解析
      Field[] fields = user.getClass().getDeclaredFields();//获取所有的属性

      for (Field field : fields) {
            //获取属性的注解
            NotNull notNull = field.getAnnotation(NotNull.class);
            if (notNull != null) { 
                Method m = user.getClass().getMethod("get" + getMethodName(field.getName()));
                Object value=m.invoke(user);//调用get方法 获取属性值
                if (value==null) {
                    System.err.println(field.getName() +notNull.message());
                    throw new NullPointerException(notNull.message());
                }else{
                    if(String.valueOf(value).length()<(notNull.length())){
                         System.err.println(field.getName() +notNull.lengthmessage());
                    }
                }
            }
        }
   }

    //把一个字符串的第一个字母大写
    private static String getMethodName(String fildeName) throws Exception {
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }
}

你可能感兴趣的:(java,开发语言)