定义:在运行时获取任意类的方法属性,调用任意对象的所有方法和属性
前提:获取类的对象(Class字节码对象):A:类的对象.getClass B:静态调用 类名.class C:静态调用 Class.forname("全类名")
获取构造方法: 1、获取public构造方法
A:Constructor<?>[] getConstructors();获取所有public的构造方法
B:Constructor<T> getConstructors(Class<?>...parameterTypes);有参传入参数类型字节码,无参不传
->字节码对象.newInstance(); [Constructor的方法:T newInstance(Object initargs)]
3、获取私有构造方法
Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes):
[clazz.getDeclaredConstructor(无参/有参);]
[去除私有权限c2.setAccessible(true);]
//公共无参构造方法
Constructor cc = clazz.getConstructor();
//获取构造方法的对象
Object oo = cc.newInstance();
System.out.println(oo);
//公共无参构造快捷创建对象
Object stu = clazz.newInstance();
System.out.println(stu);
//公共有参构造
Constructor c= clazz.getConstructor(String.class,int.class);
Object stu2 = c.newInstance();
System.out.println(stu2);
//获取私有构造
Constructor stu3 = clazz.getDeclaredConstructor(int.class,String.class);
//去除私有权限
stu3.setAccessible(true);
//创建对象
stu3.newInstance("jack",12);
System.out.println(stu3);
获取成员变量: 1、获取所有public的成员变量
Field[] getFields();获取所有的公共字段对象
Field getField(); 根据字段名获取公共字段对象
2、获取private的成员变量
Field[] getDeclaredFields();
Field getDeclaredField(String.class);
[去除私有权限 void setAccessible(true);]
3、Field方法:
Object get(Object obj);
void set(Object obj,Object value);
Class clazz = Class.forName("fanS.Student");
////公共无参构造快捷创建对象
Object stu = clazz.newInstance();
//获取公共的成员变量
Field f1 = clazz.getField("name");
f1.set(stu, "jack");
Object o1 = f1.get(stu);
System.out.println(o1);
Class clazz = Class.forName("fanS.Student");
//公共无参构造快捷创建对象
Object stu = clazz.newInstance();
//获取私有的成员变量
Field f2 = clazz.getDeclaredField("age");
//去除私有权限
f2.setAccessible(true);
f2.set(stu, 12);
Object o2 = f2.get(stu);
System.out.println(o2);
System.out.println(stu);
获取成员方法: A:无参&无返回值
B:无参&有返回值
C:有参&无返回值
D:有参&有返回值
1、获取public方法:Method getMethod(String name,Class<?>...parameter);传入方法名,参数类型字节码,调用方法
Method getMethod()->invoke()[有参要有Object接收]
2、获取private方法:Method getDeclaredMethod(String name,Class<?>...parameter)
Method getDeclaredMethod()->setAccessible(true);->invoke()
[暴力反射,破坏安全性,不提倡使用]
3、method方法:
Object invoke(Object obj,Object...args)
getMethod();公共
getDeclaredMethod();私有
//获取共有方法
Class clazz = Class.forName("fanS.Student");
Object stu = clazz.newInstance();
//无参
Method m1 = clazz.getMethod("showpub");//公共
m1.invoke(stu);
//有参
Method m3 = clazz.getMethod("sum", int.class,int.class);//公共
Object sumo = m3.invoke(stu, 1,2);
System.out.println(sumo);
//获取私有方法
Class clazz = Class.forName("fanS.Student");
Object stu = clazz.newInstance();
//无参
Method m2 = clazz.getDeclaredMethod("showpri");//私有
m2.setAccessible(true);
m2.invoke(stu);
//有参
Method m4 = clazz.getDeclaredMethod("str", String.class,String.class);//私有
m4.setAccessible(true);
Object newStr = m4.invoke(stu, "abc","ABC");
System.out.println(newStr);
JavaBean类:用于封装数据
类使用公共类修饰
成员变量私有修饰(保证安全性)
为成员变量提供get,set方法
提供公共构造方法
实现序列号接口 (Serializable)
BeanUtils工具类(需导入jar包,为Apache提供)
常用方法: void setProperty(Object bean,String name,Object value);给JavaBean对象的成员变量赋值
public static String getProperty(Object bean,String name);获取值
Person p = new Person();
//System.out.println(p);
//static void setProperty(Object bean, String name, Object value) :给JavaBean对象的成员变量进行赋值
BeanUtils.setProperty(p, "name", "zhangsan");
//BeanUtils.setProperty(p, "age", 18);
//System.out.println(p);
//static String getProperty(Object bean, String name)
String name = BeanUtils.getProperty(p, "name");
System.out.println(name);
void populate(Object bean,Map values);[map<String,Object>] 赋值
Person p = new Person();
//一个p可添加多组人员信息
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "lisi");
map.put("age", 18);
map.put("gender", "male");
BeanUtils.populate(p,map);
System.out.println(p);
小栗子
自定义BeanUtils类
public class MyBeanUtils {
private MyBeanUtils() {}
//public static void setProperty(Object bean,String name,Object value)
public static void setProperty(Object bean,String name,Object value) throws ReflectiveOperationException {
//根据JavaBean对象获取对应的字节码对象
Class clazz = bean.getClass();
//根据字节码对象获取对应的Field对象
Field f = clazz.getDeclaredField(name);
//设置权限,让虚拟机不进行访问的检查
f.setAccessible(true);
//赋值
f.set(bean, value);
}
//public static String getProperty(Object bean,String name)
public static String getProperty(Object bean,String name) throws ReflectiveOperationException {
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField(name);
f.setAccessible(true);
Object obj = f.get(bean);
return obj.toString();
}
//public static void populate(Object bean,Map map)
public static void populate(Object bean,Map map) throws ReflectiveOperationException {
//通过JavaBean对象来获取对应的字节码对象
Class clazz = bean.getClass();
//获取Map中所有的key
Set keys = map.keySet();
for (Object key : keys) {
try {
//根据key来获取对应的Field对象
Field f = clazz.getDeclaredField(key.toString());
//根据key来获取Map中对应的value
Object value = map.get(key);
f.setAccessible(true);
f.set(bean, value);
//setProperty(bean, key.toString(), map.get(key)); 继续调用上面写好的setProperty()方法
} catch(NoSuchFieldException e) {
//e.printStackTrace();
}
}
}
}