Java中最后的属性值怎么利用反射机制进行修改

  介绍

今天就跟大家聊聊有关Java中最后的属性值怎么利用反射机制进行修改,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>假设有个类

类人{
  公众最终字符串名称=癕ike";
  }

这里声明名称为非静态的属性只是为了说明反射修改最后属性无关乎静态不静态,静态只是表现在它是一个类属性,在一个类加载器空间只会有一份拷贝,仅此而已。

创建一个通用方法进行反射修改属性值

公共静态无效修改(对象对象、字符串字段名、对象newFieldValue){抛出异常
  字段字段=object.getClass () .getDeclaredField(字段名);
  
  场modifiersField=Field.class.getDeclaredField (“modifiers");
  modifiersField.setAccessible(真正的);//字段的修饰符是私有的
  modifiersField。setInt(字段,field.getModifiers (),~ Modifier.FINAL);
  
  如果(! field.isAccessible ()) {
  field.setAccessible(真正的);
  }
  
  字段。集(对象、newFieldValue);
  }

调用<代码>修改(…)方法试图修改人的名字属性

 

为什么代码执行下来没问题,但输出又还是原来的值呢?但总是可以通过反射方式获取到修改后的新值。这就是Java 编译器对最终属型的内联优化,即编译时把该最终的值直接放到了引用它的地方。即使是反射修改了该属性,但这种事后处理于事无补。

所以我在标题中所说如何有效的修改最后属性值是指:反射修改了最后属性值后能够在后续代码中使用修改后的值。

如果的人有个方法

 

那么Java会对什么类型的最终值进行内联编译呢?它们基本类型字节、字符,短,int,长,浮动,翻倍,布尔;再加上文字字符串类型(直接双引号字符串)。只要是不被编译器内联优化的最终属性都可以通过反射有效的进行修改(修改后能使用到新的值)

字符串类型比较特殊,如果把人类名字属性改成用<代码>新的字符串(“Mike")

公共最终字符串名称=新的字符串(“Mike"); 

就能够有效的使用上面的反射代码修改名称的值,最后

修改(人,“name"“Michael");   System.out.println (person.name)//输出就是迈克尔了

正如基本类型有相应的包装类型,可以把<代码>新的字符串(“Mike") 想像为“Mike"的包装类型。也确实是基本类型的最终包装类型可以被反射有效的修改,<代码>新的字符串(“Mike")>

但我们要是在IDE中写成<代码>新的字符串(“Mike")> 新的字符串(“;”)这种格式是冗余的,IDE又会把它改成“Mike",重而反射行为变得不正确。

还有,如果最终属性值是通过构造函数传入的能不能有效的被修改,当然可以,因为它也不会被编译器内联优化。

总之一句话:

为加深印象,我们最后作一个较全面的测试

公共类TestFinal {
  公共静态void main (String [] args){抛出异常
  人乔丹=new (“Chicago");
  
  修改(乔丹,“firstName"“Michael");
  system . out。println(乔丹.firstName);//迈克
  
  修改(乔丹,“lastName"“Michael");
  System.out.println (jordan.lastName);//迈克尔
  
  修改(乔丹,“age" 51 f);
  system . out。println(乔丹.age);//50.5
  
  修改(乔丹,“height" 1.98度);
  System.out.println (jordan.height);//1.98
  
  修改(乔丹,“address"新地址(“ccc",“ddd"));
  System.out.println (jordan.address.line1);//ccc
  
  修改(乔丹,“city"“Miami");
  System.out.println (jordan.city);//迈阿密
  }
  }
  
  类人{
  公众最终字符串firstName=癕ike";
  公众最终字符串lastName=新的字符串(“Jordan");//可被有效修改
  公众最终浮年龄f=50.5;
  公众最终漂浮高度=1.99度;//可被有效修改
  公共最终地址地址=新地址(“aaa",“bbb");//可被有效修改
  
  公共城市最终字符串;//可被有效修改
  
  公众人物(String市){
  这一点。城市=;
  }
  }
  
  最终类地址{
  公共line1最终字符串;
  公众最终字符串么;
  
  line1公共地址(字符串,字符串么){
  这一点。line1=line1;
  这一点。么=么;
  }
  }

Java中最后的属性值怎么利用反射机制进行修改