• 基础加强_反射


    JavaBean:数据库表和实体类的对应关系
    1.数据库中有一张表,就会有一个和表对应的类
    数据库:Person表 Java:Preson类
    2.表中的每一列,对应Java中的一个字段(成员变量)
    3.表中的每一行,对应Java中的一个对象
    张三 18 男 new Person(张三 18 男);
    小花 18 女 new Person(小花 18 女);
    多个对象可以放在一个集合中ArrayList<Person>

    JavaBean包含的内容:
    1.私有的成员变量
    2.公共的getter/setter方法
    3.空参数构造方法
    4.toString方法
    5.实现序列化接口

    获取class文件对象的三种方式:
    1.使用Object类中的方法getClass()
    Class<?> getClass() 返回此 Object 的运行时类。
    2.使用类名.class属性
    每一个数据类型,基本数据类型和引用数据类型,Java都会为其设置一个class属性
    Class clazz = int.class
    Class clazz = String.class
    Class clazz = Person.class
    3.使用Class类中的静态方法forName
    static Class<?> forName(String className)
    返回与带有给定字符串名的类或接口相关联的 Class 对象。

    注意:每个类的class文件对象只会产生一次,是唯一的

    使用反射技术获取类中的构造方法并实例化
    * public Person() {}
    * public Person(String name, int age, String sex) {}
    * private Person(String name, int age) {}
    *
    * 实现步骤:
    * 1.获取Person类的class文件对象
    * 2.使用class文件对象中的方法getConstructor获取构造方法
    * 3.使用Constructor中的方法newInstrance实例化构造方法


    快速使用反射创建空参数对象的方法
    * 使用前提:
    * 1.类中必须有空参数的构造方法
    * 2.空参数的构造方法的修饰符不能是私有private,建议使用public
    *
    * 在Class类中有一个方法
    * T newInstance() 创建此 Class 对象所表示的类的一个新实例。
    *

    使用反射技术获取类中的成员变量(字段),给成员变量赋值,获取值
    * private String name;
    * private int age;
    * public String sex;
    *
    * 实现步骤:
    * 1.获取Person类的class文件对象
    * 2.使用class文件对象中的方法getField获取成员变量
    * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值

     1  public static void main(String[] args) throws Exception {
     2         //1.获取Person类的class文件对象
     3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person");
     4         //2.使用class文件对象中的方法getField获取成员变量
     5         /*
     6          *  Field[] getFields()  获取类中所有可访问公共字段。
     7          *  Field[] getDeclaredFields()  获取类中所有的声明字段,包含私有的。
     8          */
     9         Field[] fields1 = clazz.getFields();
    10         for (Field field : fields1) {
    11             System.out.println(field);
    12         }
    13         System.out.println("------------------");
    14         Field[] fields2 = clazz.getDeclaredFields();
    15         for (Field field : fields2) {
    16             System.out.println(field);
    17         }
    18         System.out.println("------------------");
    19         
    20         /*
    21          * Field getField(String name)  获取类中指定公共成员字段。
    22          * Field getDeclaredField(String name)  获取类中指定的声明字段,包含私有的。
    23          * 参数:
    24          *     String name:字段的名字
    25          */
    26         //public String sex;
    27         Field sexField = clazz.getField("sex");
    28         System.out.println(sexField);
    29         //private String name;
    30         Field nameField = clazz.getDeclaredField("name");
    31         System.out.println(nameField);
    32         //private int age;
    33         Field ageField = clazz.getDeclaredField("age");
    34         System.out.println(ageField);
    35         
    36         /*
    37          * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值
    38          * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 
    39          * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
    40          * 参数:
    41          *     Object obj:要设置值/获取的值的对象,可以使用反射快速创建
    42          *     Object value:给成员变量设置的实际值
    43          * 返回值:
    44          *     Object:获取成员变量的返回值    
    45          */
    46         //使用反射创建对象
    47         Object obj = clazz.newInstance();
    48         
    49         //public String sex;
    50         //get(obj);-->getSex();
    51         Object sexValue = sexField.get(obj);
    52         System.out.println(sexValue);//默认值 null
    53         
    54         /*
    55          * private String name;
    56          * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)
    57          */
    58         nameField.setAccessible(true);
    59         Object nameValue = nameField.get(obj);
    60         System.out.println(nameValue);//默认值 null
    61         
    62         //private int age;
    63         ageField.setAccessible(true);
    64         Object ageValue = ageField.get(obj);
    65         System.out.println(ageValue);//默认值 0
    66         System.out.println("------------------");
    67         /*
    68          * 设置成员变量的值
    69          */
    70         //public String sex;
    71         sexField.set(obj, "妖");
    72         //获取值
    73         sexValue = sexField.get(obj);
    74         System.out.println(sexValue);//75         
    76         //private String name;
    77         nameField.set(obj, "泰国美女");
    78         //获取值
    79         nameValue = nameField.get(obj);
    80         System.out.println(nameValue);//泰国美女
    81         
    82         //private int age;
    83         ageField.set(obj, 18);
    84         //获取值
    85         ageValue = ageField.get(obj);
    86         System.out.println(ageValue);//18
    87         System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]
    88     }

    使用反射技术获取类中的成员方法,并执行
    * public String getName()
    * public void setName(String name)
    * private void method()
    *
    * 实现步骤:
    * 1.获取Person类的class文件对象
    * 2.使用class文件对象中的方法getMethod获取成员方法
    * 3.使用Method中的方法invoke执行获取到的方法
    *
    * Method类中的方法:getName,获取方法名称
    * String getName() 以 String 形式返回此 Method 对象表示的方法名称。

     1 public static void main(String[] args) throws Exception {
     2         //1.获取Person类的class文件对象
     3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person");
     4         //2.使用class文件对象中的方法getMethod获取成员方法
     5         /*
     6          * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的
     7          * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
     8          */
     9         Method[] methods1 = clazz.getMethods();
    10         for (Method method : methods1) {
    11             System.out.println(method);
    12         }
    13         System.out.println("----------------------");
    14         Method[] methods2 = clazz.getDeclaredMethods();
    15         for (Method method : methods2) {
    16             System.out.println(method.getName());
    17         }
    18         System.out.println("----------------------");
    19         /*
    20          *  Method getMethod(String name, Class<?>... parameterTypes) 获取类中指定公共成员方法。
    21          *  Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有的.
    22          *  参数:
    23          *      String name:方法的字符串名称
    24          *      Class<?>... parameterTypes:方法参数列表的class对象    
    25          */
    26         //public String getName()
    27         Method getNameMethod = clazz.getMethod("getName");
    28         System.out.println(getNameMethod);
    29         
    30         //public void setName(String name)
    31         Method setNameMethod = clazz.getMethod("setName", String.class);
    32         System.out.println(setNameMethod);
    33         
    34         //private void method()
    35         Method privateMethod = clazz.getDeclaredMethod("method");
    36         System.out.println(privateMethod);
    37         
    38         /*
    39          * 3.使用Method中的方法invoke执行获取到的方法
    40          * Object invoke(Object obj, Object... args) 
    41          * 参数:
    42          *     Object obj:要执行的方法的所属对象
    43          *     Object... args:执行方法,传递的实际参数
    44          * 返回值:
    45          *     Object:方法的返回值
    46          *     如果方法没有返回值,Object的值为null
    47          */
    48         Object obj = clazz.newInstance();
    49         
    50         //public String getName()
    51         Object v1 = getNameMethod.invoke(obj);
    52         System.out.println(v1);//成员变量 name的默认值:null
    53         
    54         //public void setName(String name)
    55         Object v2 = setNameMethod.invoke(obj, "楼上老宋");
    56         System.out.println(v2);
    57         
    58         v1 = getNameMethod.invoke(obj);
    59         System.out.println(v1);//成员变量 name的值:楼上老宋
    60         
    61         /*
    62          * private void method()
    63          * 使用暴力反射,取消Java的权限检查
    64          */
    65         privateMethod.setAccessible(true);
    66         privateMethod.invoke(obj);//私有方法
    67         
    68         System.out.println("-------------");
    69         //获取返回值为数组的方法
    70         Method arrMethod = clazz.getMethod("methodArr");
    71         Object v3 = arrMethod.invoke(obj);
    72         int[] arr = (int[]) v3;
    73         System.out.println(v3);
    74         System.out.println(arr);
    75         for (int i : arr) {
    76             System.out.println(i);
    77         }
    78     }

    反射的综合案例:
    * 通过反射技术,获取JavaBean的对象,给JavaBean的成员变量注入(赋)值
    *
    * 实现步骤:
    * 1.创建JavaBean(User类)
    * 2.创建data.properties配置文件,配置成员变量的实际使用的值
    * 3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中
    * 4.使用反射技术创建JavaBean对象
    * 5.遍历Properties集合
    * 6.使用Properties集合key拼接setXXX方法
    * 7.使用反射技术获取setXXX方法
    * 8.使用反射技术执行setXXX方法,给成员变量注入值

     1 public static void main(String[] args) throws Exception {
     2         //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中
     3         Properties prop = new Properties();
     4         prop.load(new FileReader("data.properties"));
     5         //4.使用反射技术创建JavaBean对象
     6         Class clazz = Class.forName("cn.itcast.demo02.javabean.User");
     7         Object obj = clazz.newInstance();
     8         //5.遍历Properties集合
     9         Set<String> set = prop.stringPropertyNames();
    10         for (String key : set) {
    11             /*
    12              * 6.使用Properties集合key拼接setXXX方法
    13              * 类中的set方法:
    14              *     setId,setUsername,setPassword
    15              * 集合的key:
    16              *     id,username,password
    17              * 拼接的过程:
    18              *     1.固定的字符串:"set"
    19              *     2.获取key的首字母,变成大写
    20              *     3.获取key的其它字母
    21              */
    22             String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);
    23             //System.out.println(methodName);
    24             
    25             //7.使用反射技术获取setXXX方法
    26             Method setMethod = clazz.getMethod(methodName, String.class);
    27             //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)
    28             setMethod.invoke(obj, prop.get(key));
    29             
    30             /*
    31              * 扩展:拼接getXXX方法
    32              */
    33             String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);
    34             Method getMethod = clazz.getMethod(getMethodName);
    35             Object value = getMethod.invoke(obj);
    36             System.out.println(value);
    37         }
    38         System.out.println(obj);
    39     }

    使用反射技术获取接口
    * Class<?>[] getInterfaces() 确定此对象所表示的类或接口实现的接口

     1  public static void main(String[] args) throws Exception {
     2         //获取接口实现类的class文件对象
     3         Class clazz = Class.forName("cn.itcast.demo06.reflect.AandBImpl");
     4         //使用Class中的方法getInterfaces获取实现的实现的接口
     5         Class[] clazzs = clazz.getInterfaces();
     6         for (Class c : clazzs) {
     7             System.out.println(c);//接口
     8             //使用接口class文件对象,创建实现类对象,调用实现类中的方法
     9             Object obj = clazz.newInstance();
    10             Method method = c.getMethod("a");
    11             method.invoke(obj);
    12         }
    13     }
  • 相关阅读:
    Python3——爬取淘宝评论
    python爬虫 URL分析
    python3爬取网页图片
    python_2 / python_3 区别与安装问题
    vue.$nextTick 解决了哪些问题
    Vue 路由缓存
    vue elementui form表单验证
    Hadoop Hive sql 语法详解
    sql server, mysql, oracle平时用法的区别
    Excel中值得收藏的12个函数公式
  • 原文地址:https://www.cnblogs.com/caigq/p/7049134.html
Copyright © 2020-2023  润新知