什么是Java反射机制,有何作用

前言

平时在项目开发时很少用到Java反射,偶尔在某个项目中才实际用到它。其实Spring控制反转和切面编程都涉及到Java反射。控制反转通过反射机制来实现依赖注入,而切面编程则通过反射机制来动态地代理目标对象并在方法执行前后进行增强操作。因此,Java反射是Spring框架中非常重要的一部分。

一、基本概念

1.何为Java反射机制

Java反射机制是指在程序运行时动态地获取Class类的信息、属性、方法等以及动态调用对象的方法的功能。

2.作用是啥?

(1)通过Java反射机制,可以在运行时获取类的名称、属性和方法等信息,并且可以在运行时调用对象的方法和属性。
(2)Java反射机制是Java语言的一种特性,它使得Java程序可以在运行时动态地加载、探知和使用编译期间完全未知的类。
(3)Java反射机制为Java程序的动态性提供了很大的支持,使得Java程序可以更加灵活和智能。

3.如何获取Class对象

(1)可通过类名.class
(2)实例对象.getClass()
(3)Class.forName("类名")

二、使用方式

1.获取字段名/方法名

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

public class Main {
    public static void main(String[] args) throws Exception {
        Class clazz = Orange.class;
        System.out.println(clazz.getField("name"));
        Field[] fields = clazz.getFields();
        System.out.println("fields -> " + Arrays.toString(fields));
        Field[] declaredFields = clazz.getDeclaredFields();
        System.out.println("declaredFields -> " + Arrays.toString(declaredFields));
        Method[] methods = clazz.getMethods();
        System.out.println("methods -> " + Arrays.toString(methods));
    }
}

class Orange extends Fruit {
    public int weight; // 重量
    private String color; // 颜色
    private boolean mature; // 成熟

    @Override
    public String toString() {
        return "Orange{" +
                "name=" + name +
                ", color='" + color + '\'' +
                ", mature=" + mature +
                ", weight='" + weight + '\'' +
                '}';
    }
}

class Fruit {
    public String name;
}

2.获取字段值

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Car car = new Car("兰博基尼");
        Class clazz = car.getClass();
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true); // 屏蔽Java语言的访问检查
        Object value = name.get(car);
        System.out.println(value); // 兰博基尼
    }
}

class Car {
    private String name;

    public Car(String name) {
        this.name = name;
    }
}

3.修改字段值

import lombok.Data;
import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Car car = new Car("兰博基尼");
        Class clazz = car.getClass();
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true); // 屏蔽Java语言的访问检查
        Object value = name.get(car);
        System.out.println(value); // 兰博基尼
        name.set(car, "玛莎拉蒂");
        System.out.println(car.getName()); // 玛莎拉蒂
    }
}

@Data
class Car {
    private String name;

    public Car(String name) {
        this.name = name;
    }
}

4.调用方法

import lombok.Data;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {
        Car car = new Car("兰博基尼");
        Class clazz = car.getClass();
        Method method = clazz.getDeclaredMethod("fn");
        method.setAccessible(true); // 屏蔽Java语言的访问检查
        method.invoke(car, null); // 通过调用invoke方法来执行目标方法
    }
}

@Data
class Car {
    private String name;

    public Car(String name) {
        this.name = name;
    }

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值