Java反射修改私人最终成员变量值的示例

  介绍

这篇文章将为大家详细讲解有关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反射修改私人最终成员变量值的示例