Java反射(一):反射概念与基本使用

反射概念与基本使用

  • 1 概述
  • 2 基本概念
    • 2.1 基本概念
    • 2.2 反射的核心类
  • 3 使用发射的基本方式
    • 3.1 获取Class类的实例
    • 3.2 访问字段
    • 3.3 调用方法
    • 3.4 调用构造方法
  • 4 示例代码
  • 5 总结

大家好,我是欧阳方超,公众号同名。

Java反射(一):反射概念与基本使用

1 概述

反射是Java中的一个重大特性,它运行程序在运行时获取类的信息、创建实例、调用方法、访问及设置成员变量的值,反射在框架和库中被广泛使用。

2 基本概念

2.1 基本概念

类的元数据:反射允许在运行时获取类的结构信息,包括类名、方法、字段等。
动态性:可以在运行时创建对象、调用方法,而无需在编译时知道具体的类或方法。

2.2 反射的核心类

Class:代表一个类的字节码信息,包括类的字段、方法、构造方法等元信息。
Field、Method、Constructor:分别表明类的成员变量、方法和构造方法的元信息。

3 使用发射的基本方式

3.1 获取Class类的实例

程序中每个类都是Class类的一个实例,通过这个实例可以获取有关类的信息,列如类的名称、字段、方法、构造函数等。获取Class类的实例是使用反射的第一步,获取Class类的实例有三种方式。
Class<?> c = Class.forName(“com.example.User”); // 动态加载 Class<?> c = User.class; // 已知类型
Class<?> c = new User().getClass(); // 通过实例获取

3.2 访问字段

Field f = c.getDeclaredField(“name”); // 获取私有字段需 – 调用 setAccessible(true)
f.setAccessible(true); // 若字段是私有的,需要绕过访问控制
Object value = f.get(instance); // 获取字段值
f.set(instance, “新值”); // 修改字段值

3.3 调用方法

Method m = c.getDeclaredMethod(“setName”, String.class);
m.setAccessible(true);
m.invoke(instance, “张三”); // 调用带参数的方法
对无参方法: Method m2 = c.getDeclaredMethod(“doSomething”); m2.invoke(instance);

3.4 调用构造方法

Constructor cons = c.getDeclaredConstructor();
cons.setAccessible(true);
T obj = cons.newInstance(); // 通过指定构造参数创建对象

4 示例代码

下面的示例展示了通过反射方式获取类的信息、创建对象、访问字段和调用方法。

package com.example.demo;

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

public class ReflectTest {
    public static void main(String[] args) {
        try {
            //获取Class对象
            Class clazz = Class.forName("com.example.demo.Person");
            //创建实例
            Object personInstance = clazz.getDeclaredConstructor().newInstance();
            //访问字段
            Field nameField = clazz.getDeclaredField("name");
            nameField.setAccessible(true);//设置允许访问自由字段
            nameField.set(personInstance, "张三");//为私有字段设置值
            //调用方法
            Method greetMethod = clazz.getDeclaredMethod("greet");
            greetMethod.setAccessible(true);
            greetMethod.invoke(personInstance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    protected String name;
    private void greet() {
        System.out.println("how are you, " + name);
    }
}

程序输出结果:

how are you, 张三

5 总结

Java反射是一个强劲的特性,能够在运行时动态操作类和对象。虽然它带来了灵活性,但也伴随着性能开销和安全性问题,列如,可以绕过访问控制,破坏封装,也会降低代码可读性。在实际应用中,合理使用反射可以大大提升程序的动态性和可扩展性,但应注意其潜在的缺陷和影响。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜爱我的文章,欢迎点赞、转发、评论加关注。我们下次见。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...