被private修饰的变量没有set函数也能赋值

众所周知,被private修饰的变量,只能在本类访问

访问权限

本类

本包的类

子类

非子类的外包类

public

protected

default

private

1、public: 所修饰的类、变量、方法,在内外包均具有访问权限;
2、protected: 这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但只对同包的类是可访问的,对外包的非子类是不可以访问;
3、包访问权限(default): 只对同包的类具有访问的权限,外包的所有类都不能访问;
4、private: 私有的权限,只对本类的方法可以使用;

定义一个studen类

public class Student {
	private String name;
	
	private Integer age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}
}

特意没有age属性的set函数

定义student子类subStudent

public class SubStudent extends Student{
	
	/**
	 * 子类新增的属性
	 */
	private String sex;

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}	
}	

在subStudent写mian函数,测试下subStudent能否修改age变量

如上图,ide工具是没有提示setAge函数,因此不能给age赋值

测试能否直接给student实例赋值age属性

如上图,student实例也不能直接赋值,因为定义的student类没有setAge函数

画重点:使用反射骚操作就能解决此问题,上代码

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		SubStudent subStudent = new SubStudent();
		subStudent.setSex("可以设置");
		subStudent.setName("可以设置");
		
		//subStudent.set
		
		
		
		Student student = new Student();
		student.setName("可以设置");
		
		//使用反射骚操作就能解决此问题
		
		int newAge = 666; //准备给age赋值的变量
		
		Class<? extends Student> class1 = student.getClass();
		Field declaredField = class1.getDeclaredField("age");
		declaredField.setAccessible(true);
		declaredField.set(student, newAge);
		
		System.out.println("打印反射赋值后的值:" + student.getAge());

	}

控制台打印

打印反射赋值后的值:666

总结

此场景主要是作用于一些第三方jar包,没有提供修改字段的权限,但是业务上又需要修改,因此可以使用反射赋值修改

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值