使用反射获取类的信息
获取类的所有变量信息
调用getFields()输出类以及父类所有的public声明的变量;
调用getDeclaredFields()输出类的所有成员变量,不问访问权限;
获取类的所有方法信息
调用getMethods()输出类以及父类所有的public声明的方法;
调用getDeclaredMethods()输出类的所有成员方法,不问访问权限;
访问或操作类的私有变量和私有方法
新建一个测试类
1 | public class TestClass { |
访问私有方法
访问TestClass中privateMethod()私有方法,直接看代码,注释写的很清楚:
1 | /** |
访问私有变量
访问TestClass中的MSG变量,其初始值为 “Original” ,我们要修改为 “Modified”,直接看代码:
1 | /** |
修改私有常量
补充一个知识点:
Java 虚拟机(JVM)在编译 .java 文件得到 .class 文件时,会优化我们的代码以提升效率。其中一个优化就是:JVM 在编译阶段会把引用常量的代码替换成具体的常量值,所以就算我们修改了私有常量也没有多大的意义。为了修改有意义,我们可以尝试如下修改:
方法一
在声明常量时不赋值,在构造函数里赋值,因为构造函数是在new对象时才会调用,所以就避免了JVM编译阶段的优化
方法二
使用三目运算符赋值,因为三目运算符是在运行时刻计算的,所以也避免了编译时候被优化:
1 | private final String FINAL_VALUE |
最后总结一下,私有常量通过反射肯定是可以修改的,只是修改以后有没有意义还需要再确定。