Day_13反射反射机制: 在运行时,我们可以获取所有类的方法和属性(包括私有的)
反射的前提:
首先回去类的对象(Class字节码对象) 用类的字节码对象来调用类的成员变量和成员方法
我们调用Class类的构造方法来获取相对应的类的构造方法的对象两种构造方法
获取字节码对象的3种方法
第一种// 获取类的构造方法,以对象数组的性是显示(但是它只能调用public修饰的构造方法) Constructor[] cs=类的字节码对象.getConstructors();
第二种
Class clazz = Class.forName("itheimaDemo.Sutdent");
//什么值也不传入,返回的就是我们无参构造
Constructor con=clazz.getConstructor();
System.out.println(con);通过获取的构造方法对象,来初始化
Constructor c=clazz.getConstructor(String.class,String.class);
System.out.println(c);
Object obj=c.newInstance("小明","男");
System.out.println(obj); ///输出的是初始化以后的类的成员变量
反射使用的相关类和方法重点:MayBeanUtils重写 package MyBeanUtils;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MyBeanUtils {
// static void setProperty(Object bean, String name, Object value)
public static void setProperty(Object bean, String name, Object value)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
// 先获得字节码对象
Class cl = bean.getClass();
// 获取成员变量
Field fie = cl.getDeclaredField(name);
// 赋值操作
fie.setAccessible(true);
fie.set(bean, value);
}
// static String getProperty(Object bean, String name)
public static Object getProperty(Object bean, String name)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Class clzz = bean.getClass();
// field 获取全部变量
Field fiel = clzz.getDeclaredField(name);
fiel.setAccessible(true);
Object s = fiel.get(bean);
return s;
}
// static void populate(Object bean, Map properties)
public static void populate(Object bean, Map map) throws RuntimeException, IllegalAccessException {
// 首先获得Class字节码文件
Class clzz = bean.getClass();
// 创建set集合
Set<Entry> entrySet = map.entrySet();
for (Entry entry : entrySet) {
// 捕捉异常
try {
Field fie = clzz.getDeclaredField(entry.getKey().toString()); // name==key
// 暴力访问
fie.setAccessible(true);
Object value = entry.getValue();
fie.set(bean, value);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}