java的反射方法
一个类,被加载到方法区,会创建一个“类对象”,类型是 Class类型
获取类对象
类名.class
String.class
Integer.class
Class.forName("完整类名的字符串")
Class.forName("java.lang.String")
对象.getClass()
str.getClass()
date.getClass()
获得包名类名
c.getPackage().getName()
c.getName()完整类名
c.getSimpleName()简写类名
获得成员变量定义信息
getFields()获得所有可见的成员变量,包括继承的变量
getDeclaredFields()本类定义的所有成员变量,包括私有变量,不包括继承的变量
getField(变量名)
getDeclaredField(变量名) 获得一个变量
获得构造方法定义信息
getConstructors()所有可见的构造方法
getDeclaredConstructors()所有的构造方法,包括私有
getConstructor(参数类型列表)
getDeclaredConstructor(参数类型列表) 获得一个构造方法
获得方法定义信息
getMethods()可见的方法,包括继承的方法
getDeclaredMethods()本类定义的所有方法,包括私有,不包括继承的
getMethod(方法名,参数列表)
getDeclaredMethod(方法名,参数列表) 获得一个方法
反射创建对象
/**执行无参构造*/
Object obj = c.newInstance();
/**执行有参构造*/
//获得构造方
Constructor t = c.getConstructor(int.class, String.class)
//新建实例,并执行这个有参构造
Object obj = t.newInstance(5, "abc")
反射调用成员变量
Field f = c.getDeclaredField(变量名) 获取成员变量
f.setAccessible(true) 使私有变量也能访问
f.set(实例, 值) 赋值
f.get(实例)取值
反射调用方法
Method m = c.getDeclaredMethod(方法名, 参数类型列表) 获取方法
m.setAccessible(true) 使私有方法可以被调用
Object r = m.invoke(实例, 参数数据) 调用方法
其他
在查看反射相关的Class、Field 、Constructor 等类时,
看到他们都有这样一个方法:getModifiers():
返回此类或接口以整数编码的 Java 语言修饰符。
如需要知道返回的值所代表的意思,
则需要用到 java.lang.reflect.Modifier 这个类,
这个类提供了 static 方法和常量,
可以对类和成员访问修饰符进行解码
int modifiers = field.getModifiers();
//判断是否被变量 transient和static修饰
if (!Modifier.isTransient(modifiers)&& Modifier.isStatic(modifiers))