Java通过反射访问及修改类内的私有变量
写mod的时候,界⾯某项功能显⽰定位需要⽤到玩家周围的boss信息,然⽽这个信息存储在⼀个私有的Map变量⾥,所在的类也没有提供get⽅法。最后发现可以利⽤反射获取该私有变量的值。
以下是⽰例代码,其中field.setAccessible(true)最为重要。
import java.util.ArrayList;
import flect.Field;
public class Test {java反射的作用及应用场景
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
TestClass testClass = new TestClass();
// 获取TestClass对象的所有变量
Field[] fields = Class().getDeclaredFields();
for (Field field : fields){
// 设置为为true时可访问私有类型变量
field.setAccessible(true);
// 根据获取到的变量名输出变量值
// 这⾥的get和set可能抛出IllegalAccessException异常
Name()){
case "integer":
System.out.println("integer:" + (testClass));
break;
case "string":
// 即使是final修饰的变量也能改变其值
field.set(testClass, "new text");
System.out.println("string:" + (testClass));
break;
case "arrayList":
@SuppressWarnings("unchecked")
ArrayList<Double> arrayList = (ArrayList<Double>) (testClass);
arrayList.add(5.6);
for(Double d : arrayList){
System.out.println("arrayList:" + d);
}
}
}
/
/ 也可以根据已知的变量名获取值,但是可能抛出NoSuchFieldException异常
Field field = Class().getDeclaredField("integer");
field.setAccessible(true);
field.set(testClass, 1);
System.out.println("integer:" + (testClass));
}
}
class TestClass{
public final int integer = 0;
private final String string = "text";
private final ArrayList<Double> arrayList = new ArrayList<>();
public TestClass(){
arrayList.add(1.2);
arrayList.add(3.4);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论