Java反射与注解

本文详细介绍了Java中的反射机制,包括Class、Field、Method和Constructor类的使用,以及如何通过反射获取类的属性和方法。同时讲解了Java注解的概念,元注解的作用,以及注解处理器在实际中的应用,以Apple类为例进行说明。
摘要由CSDN通过智能技术生成

Java反射与注解


Java反射
1、反射机制概念

在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java 语言的反射机制。

2、Java反射API

反射API用来生成JVM中的类、接口或则对象的信息。

  1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
  2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
  3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
  4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
3、实例代码展示
 /**
         * 获取class对象的三种方式
         */
        //静态方法 性能和安全性最好 常用方式 类的全路径
        Person person = new Person();
        person.setName("孙淼");
        Class<?> person01 = Class.forName("com.sm.bean.Person");
        //类对象.class
        Class<Person> person02 = Person.class;
        //类的实例对象.getClass方法
        Class<? extends Person> person03 = person.getClass();

        //通过Class文件创建对象
        Person obj1 = (Person)person01.newInstance();
        Constructor<?> declaredConstructor = person01.getDeclaredConstructor(null);
        Person obj2 = (Person) declaredConstructor.newInstance();
        /**
         * 获取所有成员属性
         */
        //获取所有成员属性,包括私有的
        Field[] declaredFields = person01.getDeclaredFields();
        //获取所有非私有属性
        Field[] fields = person01.getFields();
        for (Field declaredField : declaredFields) {
            String name = declaredField.getName();
            System.out.println(name);
        }
        /**
         * 获取所有成员方法
         */
        //获取所有方法,包括私有方法
        Method[] declaredMethods = person01.getDeclaredMethods();
        Method method = person01.getDeclaredMethod("sayHello");
        method.invoke(person);
        /**
         * 获取所有构造器
         */
        Constructor<?>[] declaredConstructors = person01.getDeclaredConstructors();
Java注解
1、概念

Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 Annotation 对象来获取注解中的元数据信息。

2、四种元注解
  1. @Target 修饰的对象范围,可被用于 packages、types(类、接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标。

  2. @Retention 定义 被保留的时间长短(即:被描述的注解在什么范围内有效),有三种取值分别是SOURCE:在源文件中有效(即源文件保留), CLASS:在 class 文件中有效(即 class 保留),RUNTIME:在运行时有效(即运行时保留)

  3. @ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以

    被例如 javadoc 此类的工具文档化。

  4. @Inherited 阐述了某个被标注的类型是被继承的,如果一个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该 class 的子类。

3、注解处理器
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {

    /*供应商编号*/
    public int id() default -1;

    /*供应商名称*/
    public String name() default "";

    /*供应商地址*/
    public String address() default "";
}

public class Apple {

    @FruitProvider(id = 1,name = "陕西红富士集团" , address = "陕西西安市延安路")
    private String appleProvider;

    public void setAppleProvider(String appleProvider) {
        this.appleProvider = appleProvider;
    }

    public String getAppleProvider() {
        return appleProvider;
    }
}
//注解处理
 public static void getFruitInfo(Class<?> clazz) {
        String strFruitProvider = "供应商信息:";
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(FruitProvider.class)) {
                FruitProvider annotation = field.getAnnotation(FruitProvider.class);
                //获取注解信息
                strFruitProvider =
                    "供应商Id" + annotation.id() + " 供应商名称:" + annotation.name() + "供应商地址:"+ annotation.address();
                System.out.println(strFruitProvider);
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值