zoukankan      html  css  js  c++  java
  • java中的反射机制和javaBean

    反射
      反射:就是通过一个类加载进方法区时加载到栈内存中的Class字节码文件对这个类进行解剖

      通过反射可以获取到一个类的构造方法,成员方法,成员变量
      反射将一个类的各个部分映射成相应的类

    反射获取构造方法
      Class类中方法
        Constructor<?>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法
        Constructor<T> getConstructor(Class<?>...parameterTypes)返回指定了参数的构造方法(因为是在字节码文件中去找,所以参数也是字节码文件)
        参数
          Constructor 用来描述构造方法的类 返回回来的就是Constructor对象
          Class<?>...parameterTypes 可变参数 是构造方法参数类型 如果参数不写 则返回空参构造方法
      Constructor
        T newInstance(Object...initargs) 运行构造方法创建对象
          返回值T 是泛型 没有泛型就是Object 类型
          参数 为构造方法要使用的实际参数 参数不写则运行的是空参构造方法(方法运行的时候传入的参数就是正常的参数)

      1.获取字节码文件对象
      2.通过字节码文件对象获取构造方法对象
      3.通过构造方法对象调用方法运行构造方法

    反射获取对象的快捷方式
      Class类的方法
        T newInstance() 创建此Class对象所表示的类的一个新实例
        前提 必须有空参构造 空参构造必须public修饰
      1.获取字节码文件对象
      2.通过字节码文件字节调用newInstance()创建对象

    反射获取成员变量(因为成员变量都是私有,所以很少用)
      Class类中方法
      //因为属性名不能重复,所以只用传参数名就可以得到Field
        Field getField(String name) 返回指定变量名的成员变量
        Field[] getFields() 返回所有成员变量
      Field类中的方法
        void set(Object obj, Object value) 为指定对象的成员变量赋值 obj为要赋值的对象,value为要赋的值
        Object get(Object obj) 返回此对象该属性的值
      1.获取字节码文件对象
      2.通过字节码文件对象获取字段对象
      3.调用set方法为字段赋值 注意 需要给定一个对象 可以通过快捷方式创建对象

    暴力反射:
      如果需要得到字节码中私有的属性或者方法
      Field[] getDeclaredFields()
      Method[] getDeclaredMethods()
      同样可以得到私有的指定属性或者方法
      Method getDeclaredMethod(String name, Class<?>... parameterTypes

      Method[] getDeclaredMethods() 返回该字节码文件中的所有方法,不含构造,不含继承

      得到私有的属性或者方法之后,将其设置为反射时取消语言访问检查

      void setAccessible(boolean flag)

    反射获取成员方法
      Class类中方法
        Method[] getMehthods 获取所有公共方法(包括继承的)
        Method getMehthod(String name, Class<?>...parameterTypes) String.class int.class
          获取指定的公共方法
          name:方法名
          Class<?>...parameterTypes 方法需要的参数(String.class)
        1.获取字节码文件对象
        2.通过字节码文件对象获取方法对象
        3.调用invoke方法运行当前方法,需要对象

    java中的泛型属于伪泛型,只在编译的时候有效,可以直接用反射跳过编译时期避开泛型

    获取字节码文件的对象

    1:类名.class

    2:创建该类的实例对象,然后调用getClass()  继承自Object的方法

    3:Class.forName("该类所在的地址")  例:Class.forName("java.util.List")

    javaBean:封装的一个实体类,有属性,get/set方法,空参构造,实现可序列化接口,一般自己设置序列化ID(防止序列化之后修改类反序列化失败)

  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/chonglchong/p/6683417.html
Copyright © 2011-2022 走看看