万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!

如题。

本文演示了java中属性、方法(含构造函数)、注解的反射。

一共用到三个文件。

文件名 内容
DemoAnnotation.java 自定义注解
Test.java 测试用的类
App.java 主程序

DemoAnnotation.java

import java.lang.annotation.*;

// 自定义注解:用于演示注解反射
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface DemoAnnotation {
    String value();
    int num();
}

Test.java

@DemoAnnotation(value = "Test类注解", num = 100)
public class Test
{
    // 实例成员变量(public,方便反射读写,不破坏封装)
    @DemoAnnotation(value = "实例字段msg", num = 1)
    public String msg = "原始实例消息";

    // 静态成员变量(public)
    @DemoAnnotation(value = "静态字段staticMsg", num = 2)
    public static String staticMsg = "原始静态消息";

    public Test()
    {
        
    }

    public static void print1()
    {
        System.out.println("print1");
    }

    public void print2()
    {
        System.out.println("print2");
    }

    public static void print3(String a, int b)
    {
        for (int i = 0; i < b; i++)
        {
            System.out.println(a);
        }
    }

    @DemoAnnotation(value = "print4方法注解", num = 4)
    public void print4(String a, int b)
    {
        for (int i = 0; i < b; i++)
        {
            System.out.println(a);
        }
    }

    // 带参数构造器,用于演示构造器反射 getDeclaredConstructor
    public Test(String initMsg)
    {
        this.msg = initMsg;
    }
}

App.java

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

public class App
{
    public static void main(String[] args) throws Exception
    {
        String a = "Test";  // 类名
        String b = "print1",c="x"; // b为方法名,c、d都是运行方法需要的参数
        int d=2;

        // 反射调用Test类的print1静态方法
        // 1. 通过类名获取Class对象
        Class<?> clazz = Class.forName(a);

        // 2. 获取指定的静态方法,参数为空(null表示无参数)
        Method method = clazz.getMethod(b);

        // 3. 调用静态方法,第一个参数为null(静态方法不需要实例)
        method.invoke(null);

        //--------------------------------------------------
        // 反射调用Test类的print2动态方法(非静态方法)
        // 1. 获取print2方法
        Method dynamicMethod = clazz.getMethod("print2");

        // 2. 创建Test类的实例(动态方法需要实例)
        Object instance = clazz.getDeclaredConstructor().newInstance();

        // 3. 调用动态方法,传入实例对象
        dynamicMethod.invoke(instance);
        //--------------------------------
        //调用带参数的静态和动态方法
        method = clazz.getMethod("print3",String.class,int.class);
        method.invoke(null,c,d);

        dynamicMethod = clazz.getMethod("print4",String.class,int.class);
        instance = clazz.getDeclaredConstructor().newInstance();
        dynamicMethod.invoke(instance,c,d);

        // ==============================================
        // 构造器反射:带参数构造器 getDeclaredConstructor(类型列表)
        // ==============================================
        System.out.println("\n===== 带参数构造器反射 =====");
        Constructor<?> argConstructor = clazz.getDeclaredConstructor(String.class);
        // 使用带参构造器创建实例
        Object instanceByArg = argConstructor.newInstance("通过带参构造器初始化");
        System.out.println("带参构造创建的实例msg:" + ((Test)instanceByArg).msg);

        // ==============================================
        // Field字段反射:实例变量 + 静态变量 读取/修改
        // ==============================================
        System.out.println("\n===== Field字段反射 =====");
        // 实例字段
        Field msgField = clazz.getField("msg");
        // 读取实例字段
        String readInstanceField = (String) msgField.get(instance);
        System.out.println("读取实例字段msg:" + readInstanceField);
        // 修改实例字段
        msgField.set(instance, "修改后的实例消息");
        System.out.println("修改后实例字段msg:" + msgField.get(instance));

        // 静态字段
        Field staticMsgField = clazz.getField("staticMsg");
        // 读取静态字段,get参数填null
        String readStaticField = (String) staticMsgField.get(null);
        System.out.println("读取静态字段staticMsg:" + readStaticField);
        // 修改静态字段,set参数填null
        staticMsgField.set(null, "修改后的静态消息");
        System.out.println("修改后静态字段staticMsg:" + staticMsgField.get(null));

        // ==============================================
        // 注解反射:读取类、字段、方法上运行时注解
        // ==============================================
        System.out.println("\n===== 注解反射 =====");
        // 读取类上注解
        DemoAnnotation classAnno = clazz.getAnnotation(DemoAnnotation.class);
        System.out.println("类注解 value=" + classAnno.value() + " num=" + classAnno.num());

        // 读取实例字段上注解
        DemoAnnotation fieldAnno = msgField.getAnnotation(DemoAnnotation.class);
        System.out.println("msg字段注解 value=" + fieldAnno.value() + " num=" + fieldAnno.num());

        // 读取print4方法上注解
        Method print4Method = clazz.getMethod("print4", String.class, int.class);
        DemoAnnotation methodAnno = print4Method.getAnnotation(DemoAnnotation.class);
        System.out.println("print4方法注解 value=" + methodAnno.value() + " num=" + methodAnno.num());
    }
}

程序可正确运行,运行结果略。

posted on 2026-09-26 15:22  万金流  阅读(44)  评论(0)    收藏  举报