返回

程序员必备知识:Java进阶篇02——注解、反射与动态代理

Android

一、注解

Java注解是一种元数据,用于向Java编译器提供有关程序的信息。注解可以用于多种目的,例如:

  • 文档注释:用于生成JavaDoc文档。
  • 类型注释:用于指定类型的约束条件。
  • 元编程:用于在编译时或运行时修改程序的行为。

声明一个注解使用@interface,例如:

@interface MyAnnotation {
    String value();
}

这个注解定义了一个名为value的成员变量,类型为String。

二、元注解

对注解类进行注解的注解我们称之为元注解。常用的元注解有四个:

  • @Target:用于指定注解可以应用于哪些元素。
  • @Retention:用于指定注解在编译时或运行时是否保留。
  • @Documented:用于指定注解是否生成JavaDoc文档。
  • @Inherited:用于指定注解是否可以被子类继承。

例如,以下代码定义了一个名为MyAnnotation的注解,并使用@Target和@Retention元注解指定该注解可以应用于类、方法和字段,并且在编译时和运行时都保留:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String value();
}

三、注解应用场景

注解可以应用于多种场景,例如:

  • 验证:使用注解可以验证方法或字段的参数是否满足某些条件。
  • 配置:使用注解可以配置类的行为。
  • 扩展:使用注解可以扩展类的功能。

例如,以下代码使用@MyAnnotation注解来验证方法的参数是否为null:

@MyAnnotation(value = "参数不能为空")
public void myMethod(String param) {
    if (param == null) {
        throw new IllegalArgumentException("参数不能为空");
    }
}

四、反射

Java反射是一种在运行时检查和修改Java程序行为的技术。反射可以通过以下方式实现:

  • 获取类的信息:可以使用Class类来获取类的信息,例如类的名称、方法、字段和构造函数。
  • 调用方法:可以使用Method类来调用类的方法。
  • 获取和设置字段的值:可以使用Field类来获取和设置类的字段的值。
  • 创建对象:可以使用Constructor类来创建类的对象。

例如,以下代码使用反射来获取类名和方法名:

Class<?> clazz = Class.forName("com.example.MyClass");
Method method = clazz.getMethod("myMethod");

五、动态代理

Java动态代理是一种在运行时创建类的代理对象的技术。动态代理对象可以拦截对目标类的调用,并对这些调用进行处理。

动态代理有两种实现方式:

  • JDK动态代理:使用java.lang.reflect.Proxy类来创建动态代理对象。
  • CGLIB动态代理:使用CGLIB库来创建动态代理对象。

例如,以下代码使用JDK动态代理来创建类的代理对象:

Class<?> clazz = Class.forName("com.example.MyClass");
MyClass myClass = (MyClass) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[] {clazz}, new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 对方法调用进行处理
        return null;
    }
});

总结

注解、反射和动态代理是Java语言中的三个重要特性。这些特性可以用于多种目的,例如验证、配置、扩展和动态修改程序的行为。