• 反射的理解



    /*
    * Class类对象的三种实例化模式
    * 通过对象的确取得了对象的来源,这就是“反”的本质
    * 在反射的世界里它再看重的不再是一个对象,而是对象身后的组成(类、构造、成员...)
    *
    * 取得Class类对象的好处:可以直接通过反射实例化对象:newInstance()
    */ public static void main(String[] args) throws ClassNotFoundException { /* * 方式一:对象名.getClass() */ Class<?> clazz=new Date().getClass(); System.out.println(clazz.getName()); System.out.println("--------------"); /* * 方式二:类名.class */ clazz= Date.class; System.out.println(clazz.getName()); /* * 方式三:Class.forName(String className) */ clazz=Class.forName("java.util.Arrays"); System.out.println(clazz.getName()); }
    /*
    通过反射获取普通方法,
    通过反射实例化对象调用普通方法
    */
    package
    com.reflect; import java.lang.reflect.Method; /* * * 获取方法(java.lang.Class) * getMethod(...) * getMethods() * 调用方法: * 方法对象.invoke(...) */ class Student{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } } /* * 需要Class类对象获取普通方法 * Method setMethod=clazz.getMethod("set"+initcap(attribute), String.class); * 需要Class类对象创建一个实例化对象来执行普通方法 * setMethod.invoke(stu, value);//相当于 stu.setName(value);此方法无返回值 */ public class Reflect_Method { public static void main(String[] args) throws Exception { Class<?> clazz=Class.forName("com.reflect.Student"); Object obj = clazz.newInstance(); String attribute="name"; String value="哈哈"; //获取setName()方法,根据"set"+属性进行拼接的 Method setMethod=clazz.getMethod("set"+initcap(attribute), String.class); setMethod.invoke(obj, value);//相当于 stu.setName(value);此方法无返回值 //获取getName()方法 Method getMethod=clazz.getMethod("get"+initcap(attribute)); Object obj1=getMethod.invoke(obj);//相当于 stu.getName();此方法有返回值 System.out.println(obj1); } public static String initcap(String s){ return s.substring(0,1).toUpperCase().concat(s.substring(1)); } }
    /*
    反射操作字段
    */
    package
    com.reflect; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; /* * 反射调用成员(字段/属性) * getFileds():获取父类的所有成员 * getDeclaredFields():获取本类的所有成员 * * 设置成员值 * 成员对象.set(obj,value) * 获取成员值 * 成员对象.get(obj) * 获取成员类型 * 成员对象.getType() (比较重要) */ class People{ //public String name; private String name; } class Teacher extends People{ private String teacher; } public class Reflect_Field { public static void main(String[] args) throws Exception{ //获取Class类对象 Class<?> clazz = Class.forName("com.reflect.Teacher"); //要使用字段,必须先实例化对象 Object obj = clazz.newInstance(); //获取指定字段 Field field = clazz.getDeclaredField("teacher"); field.setAccessible(true);//取消了封装(AccessibleObject) field.set(obj,"张三");//相当于 设置(对象.teacher="张三"); Object obj1=field.get(obj);//相当于 获取(对象.teacher); System.out.println(obj1); } }
    /*
        通过遍历字段,获取字段对应的方法
      
        方法:是由set/get 和字段名 拼接而成的
       
    注意:
    采用setter设置值时,不用设置 字段对象.setAccessible(true);
    */ Class<?> clazz=Class.forName("com.mldn.reflect.Grade"); //实例化对象 Object obj = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); //遍历字段数组 for(Field f:fields){ String fieldName = f.getName(); //获取对应属性的方法(由set/get+属性拼接而成的) Method setMethod= clazz.getMethod("set"+initCap(fieldName), f.getType()); if(f.getType()==int.class){ setMethod.invoke(obj,98);// 对象.setScore(98); } if(f.getType()==String.class){ setMethod.invoke(obj,"数学"); } Method getMethod=clazz.getMethod("get"+initCap(fieldName)); Object obj1= getMethod.invoke(obj);// 对象.getScore(); System.out.println(obj); }
  • 相关阅读:
    xxl-job docker版分布式任务
    nginx学习http_access_module模块
    nginx学习sub_filter模块
    nginx学习首页随机模块
    mysql使用命令
    laravel数据填充
    LINUX下统计代码行数
    检查字符串结尾 判断一个字符串(str)是否以指定的字符串(target)结尾。
    右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
    确保字符串的每个单词首字母都大写,其余部分小写。
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/7467939.html
Copyright © 2020-2023  润新知