关于赋值的问题

关于赋值的问题

问题描述:

如果是property标签,底层就是使用反射机制调用setter方法进行赋值。我记得前面有个地方老师说过,有一种情况不是调用setter方法,而是直接通过反射获得属性,然后把属性的访问范围改成public,进行直接赋值,然后再把范围改回private。哪一种情况会这样赋值呢?


(谢谢老师)

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,同学可以参考下方代码,使用到setAccessible方法打破封装,将原本的private修饰符通过反射修改为public。这个方法的参数如果是true,表示将权限修改为public,如果是false则表示修改为private。

package com.imooc.test;

import java.lang.reflect.Field;

public class Test {
	public static void main(String[] args) throws Exception {
		//获取类对象
		Class<Teacher> c = Teacher.class;
		//获取私有属性
		Field f = c.getDeclaredField("name");
		//将访问权限进行修改
		f.setAccessible(true);
		//获取属性的值
		Object o = f.get(c.newInstance());
		//输出属性
		System.out.println(o);
	}
}
class Teacher{
	private String name = "imooc";
}

祝学习愉快!

  • 只能卷了 提问者 #1

    谢谢,这里我了解了。但是我想不起IoC是在什么时候会做这个操作

    比如我们如果是处理property标签里的内容,我们就是反射调用setter方法,如果是处理constructor-arg标签,我们就是反射调用带参构造方法然后把值或者对象传入构造方法的参数,然后让构造方法自己执行后续操作。在xml配置IoC创建对象和注入似乎都没有去直接修改属性值,那么是什么时候会让IoC去直接反射修改参数值?是不是@Value?

    2023-03-06 16:43:25
  • 好帮手慕小尤 回复 提问者 只能卷了 #2

    同学你好,在通过注解注入时,如:@Value、@Autowired注解,它的大概运行流程如下:

        在底层会通过反射获取到类中所有bean,然后获取到对应的属性,通过调用setAccessible(true),将其设置为true,这样就可以进行访问了,此时就可以为属性进行赋值从而实现注入。最后调用setAccessible(false),设置false使其无法访问。

        所以在使用注解注入时,底层就会通过反射修改属性修饰符,然后将属性值修改。

    祝学习愉快!

    2023-03-06 16:57:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师