• 反射


        定义:在运行时获取任意类的方法属性,调用任意对象的所有方法和属性
        前提:获取类的对象(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();
                        }
                    }
                }
            }
    
    
    
    
    
    smile
  • 相关阅读:
    STM32-M0中断优先级介绍
    source insight之quicker.em宏的使用
    LORA---关于LORA的30个常见问题解答
    【原创】Mac上编译Hadoop1.0.3出现的一些问题
    Mac中下载JDK手动更新出现“只支持10.7.3以上的系统版本”问题解决方案
    【Java基础】Java内部类
    【Java基础】Java类及成员和修饰符的关系
    【Java基础】Java接口的总结
    【Java基础】抽象类和抽象方法的总结
    【Java基础】Java中的多态
  • 原文地址:https://www.cnblogs.com/qiuqiu001/p/7956242.html
Copyright © 2020-2023  润新知