开发者

Getting value of public static final field/property of a class in Java via reflection

开发者 https://www.devze.com 2022-12-27 12:47 出处:网络
Say I have a class: public class R { public static final int _1st = 0x334455; } How can I get the value of the \"_1st\" via ref开发者_如何学Pythonlection?First retrieve the field property of the cl

Say I have a class:

public class R {
    public static final int _1st = 0x334455;
}

How can I get the value of the "_1st" via ref开发者_如何学Pythonlection?


First retrieve the field property of the class, then you can retrieve the value. If you know the type you can use one of the get methods with null (for static fields only, in fact with a static field the argument passed to the get method is ignored entirely). Otherwise you can use getType and write an appropriate switch as below:

Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...


 R.class.getField("_1st").get(null);

Exception handling is left as an exercise for the reader.

Basically you get the field like any other via reflection, but when you call the get method you pass in a null since there is no instance to act on.

This works for all static fields, regardless of their being final. If the field is not public, you need to call setAccessible(true) on it first, and of course the SecurityManager has to allow all of this.


I was following the same route (looking through the generated R class) and then I had this awful feeling it was probably a function in the Resources class. I was right.

Found this: Resources::getIdentifier

Thought it might save people some time. Although they say its discouraged in the docs, which is not too surprising.


I was looking for how to get a private static field and landed here.

For fellow searchers, here is how:

public class R {
    private static final int _1st = 0x334455;
}

class ReflectionHacking {
    public static main(String[] args) {
        Field field = R.class.getFieldDeclaration("_1st");
        field.setAccessible(true);
        int privateHidenInt = (Integer)field.get(null);
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消