如题。
本文演示了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());
}
}
程序可正确运行,运行结果略。
浙公网安备 33010602011771号