跳转至

注解与反射

1 注解

  1. 注解(Annotation)也被称为元数据(Metadata),用于修饰包、方法、属性、构造器、局部变量等数据信息。
  2. 注解不影响程序逻辑,但注解可以被编译或运行。
  3. 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替 JavaEE 旧版中所遗留的繁冗代码和 XML 配置等。

1.1 常用注解

  1. @Override:限定某个函数必须重载其他函数,该注解只能用于函数
  2. @Deprecated:用于表示某个程序元素(类、函数)已过时
  3. @SuppressWarnings:抑制编译器警告

1.2 元注解

修饰其他注解的注解,就被称为元注解。

  1. Retention:指定注解的作用范围
  2. Target:指定注解可以用在哪些地方
  3. Document:注定注解是否出出现在 javadoc 中
  4. Inherited:子类会继承父类的注解

2 反射

反射:动态引入类、动态调用实例的成员函数、成员变量等。

2.1 常用 API

  1. java.lang.Class
  2. java.lang.reflect.Method
  3. java.lang.reflect.Field
  4. java.lang.reflect.Constructor
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package org.yxc;

public class Calculator {
    public String name;

    public Calculator() {}

    public Calculator(String name) {
        this.name = name;
    }

    public int add(int a, int b) {
        return a + b;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package org.yxc;

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

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class<?> cls = Class.forName("org.yxc.Calculator");
        Object o = cls.newInstance();

        Method method = cls.getMethod("add", int.class, int.class);
        int res = (int)method.invoke(o, 3, 4);
        System.out.println(res);

        Field field = cls.getField("name");
        field.set(o, "My Calculator!");
        System.out.println(field.get(o));

        Constructor<?> constructor = cls.getConstructor(String.class);
        Object new_o = constructor.newInstance("New Calculator!");
        System.out.println(new_o);
    }
}

2.2 优缺点

优点:可以动态创建和使用对象,使用灵活

缺点:执行速度慢


最后更新: 2022-12-19 10:18:04

评论