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)
妙哉妙哉