java 反射一

再现上次面试的一个情景

面试官:java的工作原理是什么?

鄙人:JVM加载类用的是反射,通过classLoader及其子类(4种)依次查找

面试官继续问:java反射的原理是什么?

鄙人答曰:class反射

面试官继续追问:简单介绍下class

鄙人:...........

说实在,接触这么久java,没有拜读过《深入理解java虚拟机》真是愧对java工程师的称号

今天正好有时间,先简单写个例子

public class FieldClass {

    private int age;
    String name;
    public static final boolean STATUS = false;

    public FieldClass(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) throws SecurityException,
            NoSuchFieldException, IllegalArgumentException,
            IllegalAccessException {

        FieldClass field = new FieldClass("draem0507", 26);

        Field nameField = field.getClass().getDeclaredField("name");
        System.out.println(nameField.get(field));

        Class<FieldClass> fclass = FieldClass.class;
        Field Fields[] = fclass.getDeclaredFields();
        for (Field f : Fields) {
            StringBuffer bf = new StringBuffer();
            bf.append(f.getName());
            bf.append("[修饰符:").append(
                    isDefault(Modifier.toString(f.getModifiers())));
            bf.append("类型:").append(f.getType().getSimpleName());

            bf.append("]");
            System.out.println(bf);
        }

    }

    private static String isDefault(String modifiers) {
        String mod = modifiers;
        if (modifiers.equals("")) {
            mod = "default";
        }
        return mod;
    }

}

执行结果

draem0507
age[修饰符:2--private类型:int]
name[修饰符:0--default类型:String]
STATUS[修饰符:25--public static final类型:boolean]

1.变量name因为是默认的修饰符,所以转换之后为空,因此做了简单的操作

2.关于

Modifier.toString 中使用&(二进制相同位数都为1,则为1,否则为0)
妙哉妙哉
原文地址:https://www.cnblogs.com/draem0507/p/3127099.html