反射reflecttion的入门理解+暴力反射的应用简介

本文介绍了Java反射的基本概念,包括如何通过Class对象加载类、获取构造器、成员变量和方法,以及如何使用`setAccessible`进行暴力反射以访问私有成员。同时强调了反射在框架设计中的应用和使用时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射怎么理解,(个人白话理解,有个类,类中有很多属性、方法、构造器,可以通过一面镜子将类里面的东西像光一样反射出来,被我们看到和使用,reflecttion其实也可以理解为映像,主要为了获取类中私有的东西,通过.获取不到的东西)

总体就是,加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
而反射的第一步就是加载类,获取类的字节码Class对象,获取的方式有三种

1.直接使用类名.class获取:Class c1=类名.class

2.调用Class提供的方法:Class c2=Class.forName("全类名") 

3.调用Object提供的方法:Class c3=对象.getClass()

Class c1 = Person.class;
Class c2 = Class.forName("com.example.Person");
Person person = new Person();
Class c3 = person.getClass();

后续就可以从类中获取构造器、成员变量、成员方法

java
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sayHello() {
        System.out.println("Hello, my name is " + name + ", I'm " + age + " years old.");
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        // 获取类对象
        Class<?> clazz = Person.class;

        // 获取构造器并创建对象
        Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
        Person person = (Person) constructor.newInstance("John", 30);

        // 获取属性并设置值
        Field nameField = clazz.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(person, "Mike");

        // 调用方法
        Method sayHelloMethod = clazz.getMethod("sayHello");
        sayHelloMethod.invoke(person);
    }
}

上述中public void  setAccessible(boolean flag),将参数改为true,就能开启暴力反射,破坏私有成员变量的封装性,获取一些正常操作获得不到的东西(实体类定义私有属性也能应用了),这也是反射的主要应用(不过使用需小心谨慎),很适合做Java的框架,主流的框架都会基于反射设计出一些通用的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值