黑马程序员技术交流社区

标题: [石家庄校区]JavaEE反射学习笔记 [打印本页]

作者: g207776411    时间: 2018-4-23 15:50
标题: [石家庄校区]JavaEE反射学习笔记
本帖最后由 小石姐姐 于 2018-4-26 14:17 编辑

JavaEE反射学习笔记


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();
              }
          }
      }
  }







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2