• Java,反射机制


    今天,学习了一些Java反射机制,简单记录一下。

    按我的理解,就是在运行时,运态的获取对象相关的一些信息:

    • 对象的“类”型、哪些成员变量、哪些方法、成员变量的值、新建一个某个类的对象,等等;

    目前,我能想到的一些应用场景:

    • 各种对象(无论子类、父类、对接口的任一种实现)都扔进来,显式调用其方法等,不关心其内部具体实现。“扔进来,调,一视同仁,去个性化”
    • 给一个对象,“制造仿品”,即新建类型的对象(对象数组等);
    • 突破那个类对对象/方法的访问权限控制,破掉封装性(可访问private变量、方法),很黄很暴力;

    【1】获得“类”型

    Class<?> classType = Class.forName(“java.lang.String”);

    Class<?> classType = MyTest.class;

    Class<?> classType = object.getClass();

    【2】构造函数,构造带参数的类的对象;

    Constructor cons = classType.getConstructor(new Class[]{});

    Object o = cons.newInstance(new Object[]{});

    不带参数的,可以直接这样写:

    Object o = classType.newInstance();

    课外小拓展(新建某个类的带参数的对象):

    Class[] argsClass = new Class[args.length]; //根据Object[] args建类

    for(int i=0;i<args.length;i++){

      argsClass[i]  = args[i].getClass();

    }

    Constructor cons = classType.getConstructor(argsClass); //获取带有这此参数类型的构造函数

    cons.newInstance(args);//传入对象,新建对象

    【3】成员变量

    Field[] fields = classType.getDeclaredFields();

    Field field = classType.getDeclaredField(o);

    field.get(o);

    fileld.get(classType);//类的静态成员哦

    field.getName();

    field.getType();

    【4】方法

    Method[] methods = classType.getDeclaredMethods();

    Method method = classType.getMethod(“add”,new Class[]{int.class, int.class});

    methods.setAccessible(true);//太暴力了

    Object result = method.invoke(o, new Object[]{1,2});

    Object result = method.invoke(null, new Object[]{1,2});//执行静态方法

    【5】动态数组

    Object arr = Array.newInstance(classType, 10);

    Array.set(arr, 1, “hello”);

    String str = (String)Array.get(arr, 1);

    int[] dims = new int[]{5, 10, 15};

    Object arr = Array.newInstance(Integer.TYPE, 3);

    Object arrObj = Array.get(arr, 3);//获得一个第[3]个二维数组[10][15]

    Object arrObj2 = Array.get(arrayObj, 5);//获得一个第[5]个一组数组[15]

    Array.setInt(arrayObj2, 10, 37);//设定第10个值是37

    int[][][] arrayCast = (int[][][])arr;

    System.out.println(arrayCast[3][5][10]);

     

    【6】是否为某个类的实例

    someclass.isInstance(obj);

  • 相关阅读:
    centos7查看yum安装的软件及路径
    CentOS7图形界面与命令行界面切换(转载)
    vmware安装centos7
    如何在IE11中设置兼容模式?设置的具体方法
    docker批量删除容器、镜像
    在Linux Centos 7.2 上安装指定版本Docker 17.03
    如何避免命令 rm -rf 的悲剧
    python django整理(五)配置favicon.ico,解决警告Not Found: /favicon.ico(转载)
    Ubuntu终端命令行缩短显示路径
    virtualenv 虚拟环境依赖安装
  • 原文地址:https://www.cnblogs.com/alipayhutu/p/2439499.html
Copyright © 2020-2023  润新知