介绍
这篇文章将为大家详细讲解有关Java反射修改私人最终成员变量值的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
大家都知道使用Java反射可以在运行时动态改变对象的行为,甚至是私人最终的成员变量,但并不是所有情况下,都可以修改成员变量。今天就举几个小例子说明。
<>强基本数据类型强>
/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionUsage {private final  int 年龄=18; ,public int  getAge () { return 才能;年龄; ,} }
测试代码:
import java.lang.reflect.Field;/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionTest { ,public static  void main (String [], args) { try {才能 ,,Class reflectionUsage =, forname (“practise.practise.ReflectionUsage"); ,,ReflectionUsage o =, (ReflectionUsage) reflectionUsage.newInstance (); ,,Field age =, reflectionUsage.getDeclaredField (“age"); ,,age.setAccessible(真正的); ,,age.set (o, 68); ,,age.setAccessible(假); ,,System.out.println (o.getAge ()); ,,},catch (ClassNotFoundException e), { ,,e.printStackTrace (); ,,},catch (NoSuchFieldException e), { ,,e.printStackTrace (); }才能catch (IllegalAccessException |, InstantiationException e) { ,,} ,} }
运行结果:18
此时无法修改成员变量的年龄。
如果将初始化时代放到构造函数中会如何呢:
/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionUsage {private final  int 年龄; ,public ReflectionUsage () { this.age才能=18; ,} ,public int  getAge () { return 才能;年龄; ,} }
再执行RefectionTest会发生什么呢?会发现结果变成了68 .
为什么会发生这种情形呢?看一下这两个情况下生成的类文件有什么不同:
直接初始化:
public class ReflectionUsage { ,private final  int age =, 18; ,public ReflectionUsage (), { ,} ,public int  getAge (), { return 才能;18; ,} }
构造函数中初始化:
public class ReflectionUsage { ,private final  int age =, 18; ,public ReflectionUsage (), { ,} ,public int  getAge (), { return 才能;this.age; ,} }
可以看出如果直接初始化时,经过编译后getAge方法直接返回常量的值,而在构造函数中初始化时,返回的是这个。年龄变量的值。
<强>字符串类型强>
/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionUsage { ,private final  String reflectionString=皉eflectionString"; ,public String  getReflectionString () { return 才能;reflectionString; ,} }
测试代码:
import java.lang.reflect.Field;/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionTest { ,public static  void main (String [], args) { try {才能 ,,Class reflectionUsage =, forname (“practise.practise.ReflectionUsage"); ,,ReflectionUsage o =, (ReflectionUsage) reflectionUsage.newInstance (); ,,Field reflectionString =, reflectionUsage.getDeclaredField (“reflectionString"); ,,reflectionString.setAccessible(真正的); ,,reflectionString.set (o,“newReflectionString"); ,,reflectionString.setAccessible(假); ,,System.out.println (o.getReflectionString ()); ,,},catch (ClassNotFoundException e), { ,,e.printStackTrace (); ,,},catch (NoSuchFieldException e), { ,,e.printStackTrace (); }才能catch (IllegalAccessException |, InstantiationException e) { ,,} ,} }
运行结果:reflectionString
如果将初始化reflectionString放到构造函数中又如何呢?
/* * ,* @author Cool-Coding  2018/5/15 ,*/public class  ReflectionUsage { ,private final  String reflectionString; ,public ReflectionUsage () { this.reflectionString才能=皉eflectionString"; ,} ,public String  getReflectionString () { return 才能;reflectionString; ,} }Java反射修改私人最终成员变量值的示例