A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-26 14:17 编辑

JavaEE反射学习笔记


Day_13反射反射机制:
​        在运行时,我们可以获取所有类的方法和属性(包括私有的)
反射的前提:
​        首先回去类的对象(Class字节码对象)​        用类的字节码对象来调用类的成员变量和成员方法
我们调用Class类的构造方法来获取相对应的类的构造方法的对象两种构造方法
获取字节码对象的3种方法
  • 对象.getClass()
  • 类名.class
  • Class.forName(String clasName)


第一种
// 获取类的构造方法,以对象数组的性是显示(但是它只能调用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);    ///输出的是初始化以后的类的成员变量
      
  ​
  ​反射使用的相关类和方法
  • java.lang.Class类: 类的字节码对象

    • 获取构造方法

      • Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
      • Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0
      • Constructor<T> getConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的public的构造方法. 参数列表填写参数的字节码对象
      • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象


    • 创建对象

      • T newInstance(): 使用该类的无参构造创建一个对象



  • java.lang.reflect.Constructor类: 构造方法对象

    • T newInstance(): 通过无参构造方法对象创建一个类的对象
    • T newInstance(Object... initargs): 通过有参构造方法对象创建一个类的对象, 传入构造方法所需的参数列表
    • void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的构造方法



  • 注意:

    • Class类和Constructor类中都有T newInstance()方法, 都使用类的无参构造创建对象



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


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马