zoukankan      html  css  js  c++  java
  • 反射总结

    *******reflect******************
    概念:反射机制指的是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法


    一.获取一个class对象

    获取字节码文件对象的三种方式:


    1,object.getclass方法
    代码: Student s=new Student();
    Class<?> c=s.getClass();

    需要创建类的对象,再由对象获取

    2********通过数据类型的静态属性 class属性
    代码: Class<?> c1 = Student.class;
    System.out.println(c1);

    通过类名获取

    3*******Class类中一个静态方法
    Class<?> c2=Class.forName("com.sxt.refiectDemo.Student");
    System.out.println(c2);

    方式三的好处: 因为传入的是一个字符串,而这个字符串可以通过配置文件配置
    满足了设计原则: 开闭原则 对扩展开放,对修改关闭


    二**********获取构造方法
    1.Constructor<?>[] con = c.getConstructors();
    获取所有的公有构造方法 数组
    2,Constructor<?>[] getDeclaredConstructors()
    获取所有的构造方法 数组
    3,Constructor<?> con2=c.getConstructor (String.class,int.class);
    获取单个公有的构造方法
    4,Constructor<?> con3=c.getDeclaredConstructor(String.class,int.class);
    获取单个的所有构造方法,包含私有
    ********************************************

    通过反射获取构造方法对象并且创建对象
    步骤:

    1,获取字节码文件对象
    2,通过字节码文件对象获取构造方法
    3,通过构造方法去创建一个对象

    con3.setAccessible(true);
    暴力访问,可以通过私有构造方法创建对象

    Object obj=constructor.newInstance();

    注意:一个私有构造方法可以通过throw new error
    ("禁止访问该构造方法")来防止通过反射访问该构造方法
    *********************************


    三**********获取成员变量
    1,Field[] f=c.getFields();
    获取公有成员变量数组,包含其父类的公有成员变量

    2,Field [] f1=c.getDeclaredFields();
    获取所有的成员变量数组,本类,不包含父类

    3,Field f3=c.getField("name");
    获取单个公有成员变量 或者父类

    4Field f4=c.getDeclaredField("age");
    获取单个任意成员变量 本类,不包含父类

    通过构造方法创建对象,通过成员变量来设置对象的属性
    对于私有成员变量:
    f4.setAccessible(true);可暴力设置
    f4.set(obj, "张三");

    四*********获取成员方法
    1,Method[] methods = c.getMethods();
    获取所有的公有成员方法数组,包含父类

    2,Method[] declaredMethods = c.getDeclaredMethods();
    获取所有的成员方法数组,包含私有

    3,Method method = c.getDeclaredMethod("show")
    // 获取所有单个的成员方法,包含私有
    获取无参方法show
    method.invoke(obj);
    并且调用

    五,使用反射创建数组
    bject obj = Array.newInstance(String.class, 3);
    创建一个具有指定的组件类型和长度的新数组。

    Array.set(obj, 0, "张三");
    通过反射给数组添加元素

  • 相关阅读:
    [bug] 未能加载文件或程序集“SIPEPS, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
    [MongoDB]索引
    [MongoDB]Profiling性能分析
    [MongoDB]mapReduce
    tms mqtt
    mqtt介绍
    咏南中间件统一的数据序列(还原)类
    支付宝签名
    咏南中间件开始支持中间件桥接
    咏南数据序列(还原)类
  • 原文地址:https://www.cnblogs.com/zzjlxy-225223/p/10732112.html
Copyright © 2011-2022 走看看