zoukankan      html  css  js  c++  java
  • java学习--基础知识进阶第十三天--笔记

    今日内容
    反射
    BeanUtils类


    反射
    在运行时期,可以获取和调用类的成员(构造、成员变量和成员方法等),包括私有的。


    反射的前提:
    获取类的字节码对象(Class对象)

    获取字节码对象的方式:
    (1)对象.getClass()
    比如:
    Student s = new Student();
    Class clazz = s.getClass();
    (2)类名.class
    比如:
    Class clazz = Student.class;
    (3)Class.forName(String className):这种方式在三种方式中最常用
    比如:
    Class.forName("com.itheima_01.Student");// 方法中传递的类名必须是全类名

    Class类
    构造方法:
    public修饰的
    Constructor<T> getConstructor(Class<?>... parameterTypes):获取指定的参数的(public修饰的)构造方法
    Constructor<?>[] getConstructors() :获取所有的(public修饰的)构造方法
    所有权限修饰符修饰的
    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取(所有权限修饰符修饰的)指定的构造方法
    Constructor<?>[] getDeclaredConstructors() 获取(所有权限修饰符修饰的)所有的构造方法

    成员变量:
    public修饰的
    Field getField(String name) :获取指定的(public修饰的)成员变量(指定的String)的Field类型对象
    Field[] getFields() :获取所有的(public修饰的)成员变量的Field类型对象数组
    所有权限修饰符修饰的量
    Field getDeclaredField(String name) :获取(所有权限修饰符修饰的)指定的成员变量,包括public、protected、默认和private
    Field[] getDeclaredFields() :获取(所有权限修饰符修饰的)所有的成员变量

    方法
    public修饰的
    Method getMethod(String name, Class<?>... parameterTypes) :获取指定的(public修饰的)方法的Method类型对象
    Method[] getMethods() :获取所有的(public修饰的)方法的Method类型对象数组
    所有权限修饰符修饰的
    Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取(所有权限修饰符修饰的)指定所有的方法的Method类型对象
    Method[] getDeclaredMethods() :获取(所有权限修饰符修饰的)所有的方法的Method类型对象数组


    构造方法(Constructor)
    Constructor类
    T newInstance(Object... initargs) :调用构造方法创建对象,如果不给定参数,调用的是空参构造,如果给定参数调用的是有参构造

    使用(创建对象)
    无参的构造
    方式一:调用Constructor类中的newInstance()
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)通过Class类中的getConstructor()获取空参构造的Constructor对象
    例如:Constructor c =clazz.getConstructor();
    (3)通过Constructor类中的newInstance()方法使用空参构造创建对象
    例如:Object obj = c.newInstance();

    方式二:调用Class类中的newInstance()
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)通过Class类中的newInstance()方法使用空参构造创建对象
    例如:Object obj = clazz.newInstance();

    有参的构造
    方式:通过调用Constructor类中的newInstance(Object... initargs)
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)通过Class类中的getConstructor(Class<?>... parameterTypes)获取指定的有参构造的Constructor对象
    例如:Constructor c = clazz.getConstructor(String.class,int.class);
    (3)通过Constructor类中的newInstance(Object... initargs)方法传递实际参数通过有参构造创建对象
    例如:Object obj = c.newInstance("lisi",30);

    成员变量(Field)
    Field类
    void set(Object obj, Object value) :给指定的对象的成员变量赋值,指定一个新的值
    Object get(Object obj) :获取指定对象的成员变量的值
    void setAccessible(boolean flag):取消访问权限,暴力访问【父类继承的方法】

    使用(取值和赋值)
    public修饰的成员变量
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)创建对象
    例如:Object stu = clazz.newInstance();
    (3)调用Class类中的getField(String name)方法,获取指定的成员变量的Field类型对象
    例如:Field f = clazz.getField("age");
    (4)调用Field类中的set(Object obj, Object value)方法赋值,或者调用get(Object obj)方法取值
    例如:f.set(stu, 28);
    例如:Object age = f.get(stu);

    非public修饰的成员变量
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)创建对象
    例如:Object stu = clazz.newInstance();
    (3)调用Field类中的getDeclaredField(String name)方法,获取指定的成员变量的Field类型对象
    例如:Field f = clazz.getDeclaredField("name");
    (4)调用Field类中的setAccessible(boolean flag)方法,参数传递true
    例如:f.setAccessible(true);
    (5)调用Field类中的set(Object obj, Object value)方法赋值,或者调用get(Object obj)方法取值
    例如:f.set(stu, "李四");
    例如:Object name = f.get(stu);


    成员方法(Method)
    Method类
    Object invoke(Object obj, Object... args) :调用指定对象的指定方法,返回指定方法的返回值,
    如果Method对象底层表示的方法没有返回值,那么invoke方法的返回结果为null

    使用(调用方法)
    步骤:
    (1)获取Class对象
    例如:Class clazz = Class.forName("com.itheima_01.Student");
    (2)创建对象
    例如:Object stu = clazz.newInstance();
    (3)通过Class类中的getMethod(String name, Class<?>... parameterTypes)方法获取指定方法的Method类对象
    例如:Method m = clazz.getMethod("setName", String.class);
    (4)调用Method类中的invoke(Object obj, Object... args)方法,传递指定对象和方法的实际参数
    例如:m.invoke(stu, "lisi");

    课堂案例一:
    1、已知一个类,定义如下:
    package com.itheima;
    public class DemoClass {
    public void run() {
    System.out.println("welcome to heima!");
    }
    }
    (1)写一个Properties格式的配置文件,配置类的完整名称。
    (2)写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,
    (3)用反射 的方式运行run方法。

    课堂案例二:
    2.ArrayList<Integer> list = new ArrayList<Integer>();
    这个泛型为Integer的ArrayList中存放一个String类型的对象


    BeanUtils类
    JavaBean
    作用:用来封装数据

    规范:
    (1)类要用public修饰
    (2)成员变量用private修饰
    (3)提供public修饰的getters和setters
    (4)提供空参构造
    (5)实现序列化接口(Serializable),生成序列号


    BeanUtils
    用来简化我们对JavaBean的操作的,是JavaBean操作的工具类
    它是第三方的类库(既不是JDK提供,也不是我们自己编写),使用的时候必须要导入jar包
    是Apache软件联盟提供的一个组件
    www.apache.org

    BeanUtils类
    常用方法
    /**
    * 给指定的成员变量赋值,作用类似于setXxx()方法
    *
    * Object bean:JavaBean对象,指定哪一个对象
    * String name:成员变量的名称
    * Object value:为成员变量赋的值
    */
    static void setProperty(Object bean, String name, Object value)

    /**
    * 获取指定的成员变量的值,作用类似于getXxx()方法
    *
    * Object bean:JavaBean对象,指定哪一个对象
    * String name:成员变量的名称
    */
    static String getProperty(Object bean, String name)

    /**
    * 给指定的成员变量赋值,一次可以为对象的多个成员变量同时赋值
    *
    * Object bean:JavaBean对象,指定哪一个对象
    * Map properties:将成员变量的名称及其对应的值封装到Map集合中,一次可以同时为这些多个的成员变量赋值
    */
    static void populate(Object bean, Map properties)

    注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法

    今日内容重点
    掌握反射获取构造方法并使用
    掌握反射获取成员变量并使用
    掌握反射获取成员方法并使用
    掌握可变参数的使用
    掌握反射相关的两个课堂案例
    知道JavaBean的5个规范
    掌握BeanUtils类三个方法使用
    掌握MyBeanUtils类模拟三个方法的代码

  • 相关阅读:
    MongoDB 3.0安全权限访问控制(Windows版)
    MVC创建通用DropdownList
    当文字超出宽度,自动截取文字并加省略号
    JQuery Datatables(二)
    JQuery Datatables(一)
    PHP signal 信号
    phpunit 入门
    Wget 命令详解
    ubuntn下 apt的用法和yum的比较(转)
    navicat for mysql 安装
  • 原文地址:https://www.cnblogs.com/bigorangehasc/p/8639747.html
Copyright © 2011-2022 走看看