首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一次Maven依赖冲突采坑,把依赖调解、类加载彻底整明白了

应用启动报错IllegalAccessError 在Y模块下的单元测试运行时不会报错,但是当整个应用启动,作为程序入口的X模块,调用Y模块中的Encryptor时,发生了IllegalAccessError...根据图中的具体报错信息,是说没有权限访问getSha256Digest方法,我Ctrl+B点进getSha256Digest方法查看,如下: ?...getSha256Digest是public getSha256Digest方法是public的访问级别,我一脸懵。由于这个方法很简单,既然报错,那我就索性不用了,换成下面这种写法。...而我再去查看1.6的包下,getSha256Digest方法是private的访问级别,HmacUtils这个类也不存在。解释了之前的报错。...排查在线问题的利器-Arthas Arthas,早有听说,但一直未使用过,这次我尝试了下,觉得确实可以,安利下。

2.4K40

Java 类加载器解析及常见类加载问题

如果父类加载器找不到类或资源,则类加载器只能尝试在本地找到它们。实际上,类加载器只负责加载父级不可用的类;层次结构中较高的类加载器加载的类不能引用层次结构中较低的可用类。...在 Java EE 中,查找的顺序通常是相反的:类加载器可能在转到父类之前尝试在本地查找类。...为此,我们可以尝试将 HelloServlet 的类加载器转换为 URLClassLoader 并请求其类路径。...为了演示这一点,我们将 Factory.getUtil 方法的访问修饰符更改为默认值: class Factory {      static Object getUtil() {           ...不幸的是,如果我们试图在运行时访问它,我们将看到 IllegalAccessError 异常。

1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入浅出JVM(三)之HotSpot虚拟机类加载机制

    (运行时常量池)在堆中创建这个类的Class对象,这个Class对象是对方法区访问数据的"入口"堆中实例对象中对象头的类型指针指向它这个类方法区的类元数据对于加载可以由JVM的自带类加载器来完成,也可以通过开发人员自定义的类加载器来完成...交给当前所在类的类加载器 去加载 这个要解析的类解析前要进行符号引用验证,如果当前所在类没有权限访问这个要解析的类,抛出异常IllegalAccessError字段的解析解析一个从未解析过的字段先对此字段所属的类...(如果不具备权限抛出IllegalAccessError异常)接口方法的解析解析一个从未解析过的接口方法先对此接口方法所属的接口进行解析然后在此接口方法所属的接口中查找该接口方法简单名称和描述符都匹配的接口方法...if (true){ System.out.println(Thread.currentThread().getName() + " init...JDK7新加入的动态语言支持,部分....被动引用当访问静态字段时,只有真正声明这个字段的类才会被初始化(子类访问父类静态变量) public class TestMain { static {

    26721

    类加载机制总结

    (方法区中数据存储格式由虚拟机自行定义),然后在内存中实例化一个Class对象(在HotSpot虚拟机中,该对象存放在方法区),这个对象将作为程序访问方法区中类型数据的接口 验证 验证是连接阶段的第一步...如果发现不具备访问权限,将抛出java.lang.IllegalAccessError异常。...如果查找过程成功返回了引用,将会对这个字段进行权限验证,如果发现不具备对字段的访问权限,将抛出java.lang.IllegalAccessError异常。...最后,如果查找过程成功返回了直接引用,将会对这个方法进行权限验证,如果发现不具备对此方法的访问权限,将抛出java.lang.IllegalAccessError异常。...由于接口中的所有方法默认都是public,所以不存在访问权限的问题,因此接口方法的符号解析应当不会抛出java.lang.IllegalAccessError异常。

    52720

    类加载机制

    如果发现不具备访问权限,将抛出java.lang.IllegalAccessError异常。...如果查找过程成功返回了引用,将会对这个字段进行权限验证,如果发现不具备对字段的访问权限,将抛出java.lang.IllegalAccessError异常。...最后,如果查找过程成功返回了直接引用,将会对这个方法进行权限验证,如果发现不具备对此方法的访问权限,将抛出java.lang.IllegalAccessError异常。...在JDK 9之前,Java接口中的所有方法都默认是public的,也没有模块化的访问约束,所以不存在访问权限的问题,接口方法的符号解析就不可能抛出java.lang.IllegalAccessError...但在JDK 9中增加了接口的静态私有方法,也有了模块化的访问约束,所以从JDK 9起,接口方法的访问也完全有可能因访问权限控制而出现java.lang.IllegalAccessError异常。

    64220

    深入理解Java类加载机制-连接

    、字段、方法的访问性是否可以被当前类访问 符号验证如果无法通过,将会抛出java.lang.IncompatibleClassChangeError异常的子类,如java.lang.IllegalAccessError...点去加载数组元素类型中的类,接着由虚拟机生成一个代表此数组纬度和元素的数组对象 如果前两个步骤通过了,那么B在虚拟机中已经成为一个有效的类或者接口了,最后进行符号引用验证(验证阶段的第4个步骤),确认A是否有对C的访问权限...如果没有权限访问,抛出java.lang.IllegalAccessError异常 3.2 字段的解析 解析一个未被解析过的字段的符号引用时,首先要对其CONSTANT_Class_info进行解析。...,那么抛出java.lang.IllegalAccessError异常 3.3 类方法解析 解析一个未被解析过的方法的符号引用时,首先要对其CONSTANT_Class_info进行解析。...,需要对这个方法权限校验,如果发现A不具备对这个方法的访问权限,那么抛出java.lang.IllegalAccessError异常 3.4 接口方法解析 解析一个未被解析过的接口方法的符号引用时,首先要对其

    50310

    实习杂记(30):虚拟机类的加载机制(1)

    ,他们被称为   被动引用, 被动引用例子1: public class SuperClass { static { System.out.println("superClass init!"...虚拟机将符号引用转化为直接引用,这个转化的动作在  解析阶段发生,这里是一个交叉行为 符号引用验证可以看做是对类自身以外的信息进行匹配性校验: 符号引用中通过字符串描述的全限定名是否能找到对应的类 符号引用中类,字段,方法的访问性是否可以被当前的类访问...,其中里面还涉及到父类的加载,如果这一步都是成立的,还需要去验证当前的类是否对解析的那个类有没有访问权限, 如果没有权限,则抛出:java.lang.IllegalAccessError CONSTANT_Fieldref_info...类方法解析,第一步首先也要去解析这个字段是属于哪个类的,然后先去解析方法所属的类, 然后去父类或者接口中递归找,如果成功最后判断访问权限, 这里如果发现类方法是  一个接口名,则是错误的,抛出异常:...,接口方法解析 首先要找到这个接口方法是属于哪个接口的,然后去找这个接口类, 然后去父类或者接口中递归找,接口方法默认都是public,不需要判断访问权限的问题 这里如果发现接口方法是  一个类名,则是错误的

    48930

    Spark大数据集群日常开发过程遇到的异常及解决思路汇总

    一、出现java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch....init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator在新项目上创建以下Scala代码去连接Hbase集群,用来判断...因此,我尝试在hadoop主机器上运行指令hdfs dfs -mkdir /spark-logs指令后,可生成了一个目录/spark-logs,这时再执行spark-shell,就能正常进入scala命令行界面了...TBLPROPERTIES ("hbase.table.name" = "test");再次查询Hive,就发现整数对应的值都有了—— 这时才是正确的,六、RDD之foreach和foreachPartition方法日志查看这两个方法内的日志...,在driver端是看不到的,也就是说,即使你将driver执行日志>spark.log,在spark.log是看不到方法里面的日志的。

    1.2K00

    【读码JDK】-java.lang包介绍

    但不使用该注解,编译器还是会将满足功能接口定义的任何接口视为功能接口 IllegalAccessError 如果应用程序尝试访问或修改字段,或调用其无权访问的方法,则抛出该异常。...通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生 IllegalAccessException 当应用程序尝试反射创建实例(数组除外),当前正在执行的方法无法访问指定类的字段...搜索的类定义在编译当前正在执行的类时存在,但无法再找到该定义 NoSuchFieldError 如果应用程序尝试访问或修改对象的指定字段,并且该对象不再具有该字段,则抛出该异常。...访问或修改null对象的字段。 将null的长度视为数组。 访问或修改值为null的元素。...ThreadLocal 提供线程的局部变量,每个线程都拥有一个独立副本 Throwable 该类是所有的错误和异常的超类 TypeNotPresentException 当应用程序尝试使用表示类型名称的字符串访问类型时抛出

    1.6K20

    类加载机制你真的了解吗?

    判断调用类是否有权限访问被加载类,如果不允许的话,就抛出IllegalAccessError异常。 2)字段的解析 首先解析字段所属的类或接口的符号引用。...最后如果查找成功的话,会判断字段访问权限,如果该字段不允许访问,则抛出 IllegalAccessError异常。 这么一大段,如果乍看没明白,下面用代码解释一下就懂了。...最后,如果查找成功,会判断此方法是否有访问权限,若没有,则抛出 IllegalAccessError异常。...可以说,初始化阶段是执行类构造器 方法的过程。 首先说下类构造器 方法和实例构造器 init > 方法有什么区别。...而init > 方法是new一个对象,即调用类的 constructor方法时才会执行,是对非静态变量进行的初始化。

    56421

    Java虚拟机

    是需要先解析出 接口方法表 的class_index项中索引的方法所属的类或接口的符号引用 在JDK 9之前,Java接口中的所有方法都默认是public的,也没有模块化的访问约束,所以不存在访问权限的问题...,接口方法的符号解析就不可能抛出java.lang.IllegalAccessError异常。...但在JDK 9中增加了接口的静态私有方法,也有了模块化的访问约束,所以从JDK 9起,接口方法的访问也完全有可能因访问权限控制而出现java.lang.IllegalAccessError异常。...类的构造函数 (即在虚拟机视角中的实例构造器 init>()方法)不同,它不需要显式地调用父类构造器,Java虚拟机会保证在子类的()方法执行前,父类的()方法已经执行...假如父类加载器加载失败,抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。 3.

    71300

    Java魔法堂:类加载机制入了个门

    符号引用验证      操作对象:方法区中的类或接口信息      目的:对类的符号引用和类的实际信息(类、字段、方法)进行验证,保证符号引用可成功解析为直接引用,并当前类可以成功访问直接引用     ...当前实例是否有权限访问符号引用的类、字段和方法。    ...若不具备则抛出`java.lang.IllegalAccessError`。   2....若成功解析直接引用,则进行符号引用验证,失败则抛出`java.lang.IllegalAccessError`。 4....类A访问类B的静态常量不会导致类B的初始化。因为在编译阶段会将类使用到的常量直接存储到自身常量池的引用中,因此实际上运行时类A访问的是自身的常量与类B无关系。

    95370

    Java虚拟机

    是需要先解析出 接口方法表 的class_index项中索引的方法所属的类或接口的符号引用 在JDK 9之前,Java接口中的所有方法都默认是public的,也没有模块化的访问约束,所以不存在访问权限的问题...,接口方法的符号解析就不可能抛出java.lang.IllegalAccessError异常。...但在JDK 9中增加了接口的静态私有方法,也有了模块化的访问约束,所以从JDK 9起,接口方法的访问也完全有可能因访问权限控制而出现java.lang.IllegalAccessError异常。...类的构造函数 (即在虚拟机视角中的实例构造器 init>()方法)不同,它不需要显式地调用父类构造器,Java虚拟机会保证在子类的()方法执行前,父类的()方法已经执行...假如父类加载器加载失败,抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。 3.

    63720

    《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(上)

    :也就是按照虚拟机所需的格式存储在方法区中 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口:并没有明确规定是在Java堆中,对于HotSpot而言,...和类或接口的解析一样,如果查找过程成功返回了引用,将会对这个字段进行权限验证,权限验证失败抛出IllegalAccessError异常。...最后如果成功返回了引用,将会对这个方法进行权限验证,如果权限验证失败,抛出IllegalAccessError异常。...由于接口中的所有方法默认都是public的,所以不存在访问权限问题,因此接口方法的解析不会抛出IllegalAccessError异常。...init>()不同,它不需要显示地调用父类构造器,虚拟机会保证在子类的()方法执行之前,父类的()方法已经执行完毕。

    53520

    Android Studio Xposed模块编写(一)

    AndroidManifest.xml中增加Xposed相关内容   3、新建hook类,编写hook代码   4、在app上右键新建assets folder,然后在assets目录下新建文件xposed_init...} }); } } } 代码功能是hook 系统TelephonyManager类的getDeviceId()和getSubscriberId()方法...4、新建assets目录,在其中新建文本xposed_init,里面内容为 com.zcgames.xposedtest.XModule 最后的目录结构如下图所示 4、Hook目标应用编写 Android...,然后重启手机,再次打开目标应用,点击按钮,结果如下所示,hook成功 6、几个小坑 1、xposed加载模块失败,在xposed installer的log中看到提示如下 java.lang.IllegalAccessError...2、xposed_init中区分大小写,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也会导致模块加载失败 3、模块安装后再次使用

    2K00

    JavaSE学习总结(八)—— 异常处理(Exception)

    异常不是错误 程序中关键的位置有异常处理,提高程序的稳定性 二、掌握Java异常处理机制  Java的异常处理是通过5个关键字来实现的 try:尝试,把有可能发生错误的代码放在其中,必须有 catch:...NoSuchMethodException //抽象方法错误,当应用试图调用抽象方法时抛出 java.lang.AbstractMethodError //断言错误,用来指示一个断言失败的情况...java.lang.ClassCircularityError //类格式错误 java.lang.ClassFormatError //错误基类,标识严重程序运行问题,不应被应用程序捕获的反常情况 java.lang.Error //非法访问错误...,违反域或方法的可见性声明 java.lang.IllegalAccessError //不兼容的类变化错误,当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常 java.lang.IncompatibleClassChangeError.../被中断异常 java.lang.InterruptedException //数组大小为负值异常 java.lang.NegativeArraySizeException //属性不存在异常,当访问某个类的不存在的属性时抛出该异常

    1.3K90

    虚拟机类加载机制

    在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段。 符号引用中的类、字段和方法的访问性(private、protected、public、default)是否可被当前类访问。...如果查找过程成功返回了引用,将会对这个字段进行权限验证,如果发现不具备对字段的访问权限,将抛出java.lang.IllegalAccessError异常。...最后,如果查找过程成功返回了直接引用,将会对这个方法进行权限验证;如果发现不具备对此方法的访问权限,将抛出java.lang.IllegalAccessError异常。...4)否者,宣告方法查找失败,抛出java.lang.NoSuchMethodError异常。     因为接口方法都是public 所以没有IllegalAccessError异常。...虚拟机会保证一个类的()方法在多线程环境中被正确的加锁和同步。多线程访问,一个访问其他都被阻塞。

    47310

    面试官,不要再问我“Java虚拟机类加载机制”了

    对象,作为方法区这个类的各种数据的访问入口; 其中获取二进制字节流可以通过Class文件、ZIP包、网络、运行时(动态代理)、JSP生成、数据库等途径获取。...然后在方法区生成一个比较特殊的java.lang.Class对象,用来作为程序访问方法区中这些类型数据的外部接口。...如果返回成功了,但是是权限校验失败,也就是无该字段的访问权限,则抛出java.lang.IllegalAccessError异常。 其他形式的解析,就不再这里一一说明了。...,定义在它之后的变量,在前面的静态语句块中可以赋值,但是不能访问。...()方法与实例构造器init>()方法不同,它不需要显示地调用父类构造器,虚拟机会保证在子类()方法执行之前,父类的()方法已经执行完毕。

    38110

    Java中常见的异常类型

    EnumConstantNotPresentException 尝试使用未定义的枚举值。 IllegalArgumentException 用于调用方法的非法参数。...CloneNotSupportedException 尝试克隆不实现Cloneable接口的对象。 IllegalAccessException 对类的访问被拒绝。...java.lang.IllegalAccessError 违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。...当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。...当访问某个类的不存在的属性时抛出该异常。 java.lang.NoSuchMethodException 方法不存在异常。当访问某个类的不存在的方法时抛出该异常。

    2.3K40
    领券