小白来看:java反射与注解

1.反射获取对象的变量和方法等信息。
Class c = user.getClass();
Field field = c.getDeclaredField("id");
Method method = c.getDeclaredMethod("say", String.class);
method.invoke(user, "great!");

c 获取Class对象。

Field getDeclaredField获取变量

Method getDeclaredMethod获取方法,String.class 指定变量

method.invoke(user, "great!");//方法执行 带参数

需要注意的是如果方法是private直接访问出错,此时使用method.setAccessible(true);

2.注解:主要是实现该注解相关功能
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface TestAnno {
    String name() default "init name";
}

Target指明注解的作用域:

  • TYPE : 类、接口或enum声明
  • FIELD: 域(属性)声明
  • METHOD: 方法声明
  • PARAMETER: 参数声明
  • CONSTRUCTOR: 构造方法声明
  • LOCAL_VARIABLE:局部变量声明
  • ANNOTATION_TYPE:注释类型声明
  • PACKAGE: 包声明

Retention指定注解级别。

  • SOURCE:源码级别,注解只存在源码中,一般用于和编译器交互,用于检测代码。如@Override, @SuppressWarings。
  • CLASS:字节码级别,注解存在于源码和字节码文件中,主要用于编译时生成额外的文件,如XML,Java文件等,但运行时无法获得。 如mybatis生成实体和映射文件,这个级别需要添加JVM加载时候的代理(javaagent),使用代理来动态修改字节码文件。
  • RUNTIME:运行时级别,注解存在于源码、字节码、java虚拟机中,主要用于运行时,可以使用反射获取相关的信息。

通过反射获取注解信息(这个很多框架也是通过这种方式解析注解,进而进行注解功能的开发):

System.out.println(field.getDeclaredAnnotation(TestAnno.class).name());//111
System.out.println(c.isAnnotationPresent(TestAnno.class));//true

TestAnno.class

package com.hiro.learn.anno;

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

/**
 * Project: learn
 *
 * @author : hiro
 * @date : 2020/3/7 22:25
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface TestAnno {
    String name() default "init name";
}

Main.class

package com.hiro.learn.anno;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Project: learn
 *
 * @author : hiro
 * @date : 2020/3/7 21:52
 */
public class Main {

    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user = new User();
        user.id = 1;
        user.name = "apple";

        Class c = user.getClass();
        Field field = c.getDeclaredField("id");
        Method method = c.getDeclaredMethod("say", String.class);
        method.invoke(user, "great!");
    }
}

@TestAnno
class User {

    String name;

    @TestAnno(name = "111")
    int id;

    @TestAnno
    void say(String something) {
        System.out.println("user say: " + something);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章