zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Spring Boot发布2.6.2、2.5.8:升级log4j2到2.17.0
    如何优雅地读写HttpServletRequest和HttpServletResponse的请求体
    更快的Maven来了
    Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)
    NumPy学习笔记
    来自Java程序员的Python新手入门小结
    Java应用日志如何与Jaeger的trace关联
    Jaeger知识点补充
    分布式调用链跟踪工具Jaeger?两分钟极速体验
    Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)
  • 原文地址:https://www.cnblogs.com/alipayhutu/p/2439499.html
Copyright © 2011-2022 走看看