• java8u162反射机制的一个BUG



    import java.io.File;
    import pers.laserpen.util.java.BinaryClassLoader;
    import pers.laserpen.util.java.Reflection;
    import pers.laserpen.util.java.StaticJavaTools;

    public class Test {

    public static void main(String[] args) {
    for (int i = 1; i < 3; ++i) {
                //使用二进制方式读取类文件
    BinaryClassLoader bcl = new BinaryClassLoader(new File("."));
    bcl.searchClass("Test$R");
    System.out.println(bcl.getLoadedClass());//这里显示一次读取到的文件

    Reflection ref = new Reflection(true, bcl.getLoadedClass());//利用反射创建一个对象
    System.out.println(bcl.getLoadedClass(http://www.amjmh.com/v/));//这里本应该显示和之前一样的类名,但是却变成了PrintStream。
    int t = ref.staticValue(true, "i");
    System.out.println("reflection get:" + t);
    ref.staticValue(true, "i", i);
    System.out.println("reflection get after set:" + ref.staticValue(true, "i"));
    System.out.println("directly get:" + R.i);
    System.out.println(StaticJavaTools.isAssignableClass(ref.getObjectClass(), R.class));

    }
    }

    public static class R {
    static int i = 0;
    static {
                            //在这个静态代码段中最后一次用到的类会被写入BinaryClassLoader中。
    i = Integer.parseInt("0");
    System.out.println("R loaded");//单步调试时,这一步以后才改变了BinaryClassLoader的私有成员变量。这一步用到的类型是什么,那个成员变量就会被改成什么。与具体的操作无关。
    }

    }

    }
    这个BUG并不重要,正常的程序不会遇到这种情况。可能是java反射机制和我的代码发生了耦合,导致一个私有成员变量的引用被更改了。单步调试发现是一个无关的步骤改变了那个成员变量,所以可以认定是java中的BUG。这个工具类是我自己编写的,读者如果编写自己的工具类,估计也可能会有各种奇怪的现象。

    另外,还有一个不是BUG的现象也顺便说一下。不同类加载器对象加载的类使用的静态变量是不同的。对类型进行equals比较也只能返回false。但是对父类进行instanceof判定可以返回true。
    ---------------------

  • 相关阅读:
    RN的win7开发环境部署和问题解决
    Android EditText弹出软键盘实现页面标题头不动,软键盘弹出在编辑框下面
    android打包生成apk时自定义文件名版本号。自定义项目字段等等
    Android ConstraintLayout 约束布局属性
    AS基本设置
    PermissionUtils
    kotlin之字符串模板
    kotlin之字符串
    kotlin之数组
    kotlin之布尔类型
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11331564.html
Copyright © 2020-2023  润新知