---- 前置知识补充 classpath Java中有两个classpath,一个是bootstrap classpath,另一个是classpath。...启动类加载器的核心逻辑是在java.c文件中的LoadMainClass函数中实现的。该函数主要调用了checkAndLoadMain函数和GetLauncherHelperClass函数。...构造函数被调用的过程,具体原因参考这篇文章: 为什么Java-Launcher类上打断点无效 // java虚拟机启动的时候调用 public Launcher() { // Create...都继承自 URLClassLoader,URLClassLoader有一个URLClassPath字段: 启动类加载器对应的是null,它对应的URLClassPath是通过getBootstrapClassPath...以AppClassLoader的URLClassPath对象为例,假设程序的classpath有3个条目,记为a;b;c,则URLClassPath对象有3个Loader,这3个Loader的base
看下在URLClassLoader中如何实现findeClass的,在URLClassLoader中通过一个URLClassPath类帮助取得要加载的class文件字节流,而这个URLClassPath...); this.acc = AccessController.getContext(); } 这个URL数组也是创建URLClassPath对象的必要条件。...在 创建URLClassPath对象时,会根据传过来的URL数据中的路径来判断时文件还是jar包,根据路径的不同分别创建FileLoader或者JarLoader,或者使用默认的加载器。...解析,在这个阶段,类装入器装入类所引用的其他所有类。可以用许多方式引用类,如超类、接口、字段、方法签名、方法中使用的本地变量。...初始化class对象 在类中包含的静态初始化器都被执行,在这一阶段末尾静态字段被初始化为默认值。
最近在设计一个spring-boot的服务,在开发环境(IDE)运行的时候,没有任何问题, 但如下在命令行运行使用spring-boot-maven-plugin插件打成Fat-Jar 服务jar包时出了问题...$Loader.findResource(URLClassPath.java:658) at sun.misc.URLClassPath.findResource(URLClassPath.java...Config src/main/resources/defaultConfig.xml 项目内置的配置文件,用于保存参数的默认值 上面两个文件的优先级从上而下由高到低。...如果两个文件都定义了相同的参数,则以优先级最高的为准 User Config定义为可选的(config-optional="true"),不存在也不影响 以下是根据root.xml定义的管理模型读取用户配置的...而LaunchedURLClassLoader实现的findResource在参数为"/home/gyd/.hello_world/config.properties"这种明显找不到的资源名时,没有返回
不过,此时的this是ExtClassLoader对象。...,通过这个方法不仅能够通过class文件实例化class对象,也可以通过其他方式实例化class对象,如通过网络接收一个类的字节码,然后转换为byte字节流创建对应的Class对象。...在URLClassLoader中有一个成员变量ucp--URLClassPath对象,URLClassPath的功能是通过传入的路径信息获取要加载的字节码,字节码可以是在.class文件中、可以是在.jar...= AccessController.getContext(); } 在URLClassPath构造中,需要传入URL[]数组,通过这个URL[]数组中所指定的位置信息,去加载对应的文件。...在URLClassPath内部会根据传递的路径是文件地址、jar包地址还是网络地址来进行判断,来生成对应Loader。
Composition 函数通常用 use 开头作为关键字,比如此处的 “useResources”,以此区别于普通函数。 下面针对以上代码关键点进行一一释义: 1. ref 会创建一个动态对象。...是因为如果数组有新增项或移除项,这样做能在程序中有所表现。 一图胜万言: 2. getResources 函数用于获取数据。 3. onMounted 生命周期函数会在组件添加到 Dom 时调用。...以上便是超重要的新特性 composition API 的实战介绍。 Data 选项 在 Vue2 中,data选项不是对象就函数,但是在 Vue3 中将只能是函数。这将被统一成标准。...: {{title | capitalized }} 这样的表达式不是合法有效的 Javascript,在 Vue 中实现这样的写法需要额外的成本。...你可以使用简单的原生函数来操作数组或对象。
和HandlerMethodReturnValueHandler,前者表示一个参数解析器,后者除了解析参数之外还可以处理相应类型的返回值。...有趣的是这里如果两个相同参数的请求,其只会取第一个的值,而如果是RequestParamMethodArgumentResolver进行处理时会把两个参数值通过,进行连接。...在这里我们补充下BeanWrapper相关的内容,在Spring中,BeanWrapper接口是对Bean的包装,定义了对包装对象的属性值的访问与修改的接口,BeanWrapperImpl则是对BeanWrapper...,其实我们已经大致理解了payload的格式,包括为什么用class.module.classLoader而不是直接class.classLoader。...在Tomcat中是ParallelWebappClassLoader,而且其有一个属性getResources,就这样层层递归,最终操作日志,达成任意文件写入,从而实现RCE,在SpringBoot的LaunchedURLClassLoader
); } 2.跟进方法中,我们可以知道在里面调用ClassLoaderWrapper类的一个实例对象的getResourceAsStream()方法,这个classLoaderWrapper怎么来的呢...在Resources.class中我们只是使用private static ClassLoaderWrapper classLoaderWrapper = new ClassLoaderWrapper(...,只要把返回值往上一层返回就可以得到这个配置文件所需要的inputstream。...build方法,也就是使用配置对象构建一个DefaultSqlSessionFactory对象,在上面返回这个对象,也就是我们的sqlsessionFactory。...openSessionFromDataSource()这个方法,从名字可以大概知道是从数据源加载Sqlsession,里面可以指定执行器类型,事物隔离级别,还有是否自动提交,如果不设定,那么默认是null以及false,在方法内主要做的是将配置文件对象的环境取出来构造事务工厂
System.MulticastDelegate中有几个重要的私有字段: 字段 类型 描述 _target System.object 指向回调函数被调用时应该操作的对象,用于实例方法的回调 _mothodPtr...,但是这和MyDelegate构造函数的参数并不匹配,但是却编译通过了,为什么呢?...在构造器内部,这两个参数会被保存到相应的私有字段中。 另外_prev被设置为null,该对象用来创建一个委托链表[指向下一个委托对象]。 每个委托对象实际上是对方法及其调用时操作的对象的一个封装。...如果都为null返回ture;如果都不是null,则查看_prev字段指示的链表是否有指定的长度,并且两个链表上的对应委托对象的_target和_methodPtr字段也是否匹配,如果匹配就返回ture...不仅如此,如果一个被调用的委托链中有一个抛出了异常,或者阻塞了很久其他的委托对象将被阻止调用。
,一个是int型表示改变后的state,可通过字段EXTRA_WIFI_STATE获取,还有一个是int型的改变前的state(如果有的话)可通过字段EXTRA_PREVIOUS_WIFI_STATE获取...updateAccessPoints(),扫描加载列表这块感觉相当复杂,慢慢分析 首先在扫描结束后可以通过getScanResult()获取到扫描后的WiFi列表,返回值为List,所返回的每个WiFi会携带如下信息 各字段分别代表什么含义呢?...updateAccessPoints方法进行更新列表,在该方法中会根据WiFi的开关状态来对UI进行更新,只有在WiFi开启时 才会去更新列表,这里不再对其他情况进行赘述,在WiFi开启时会通过如下代码加载...EXTRA_NETWORK_INFO可以获取到WiFi连接的状态,如果是已连接的状态,则会有额外的两个字段,字段EXTRA_BSSID可以获取到所连接的WiFi的bssid,字段EXTRA_WIFI_INFO
不过这个仍然不是最终的结果。要得到最终的结果,还需要加上两个指针的长度。原因是,每个分配在堆上的对象都会有两个指针的“额外开销”,这两个开销分别是同步块索引和类型指针。...接下来要做的是初始化分配得到的内存块。这个很简单,只要把这段内存的所有二进制位都设为0就可以了。 然后就是初始化两个“额外开销”的值了。...然后,CLR分配所需的内存。在哪里分配呢?这可说不准,在堆上或在栈上都有可能。 再然后就是调用类型构造函数了。这里需要注意,CLR并没有初始化这段内存块,而是把初始化内存块的任务都交给构造函数了。...这样做是为了保证值类型轻量性的特点。这也是为什么C#语言在值类型的构造函数中强制要求为所以字段赋值的原因。另外,所有值类型的默认构造函数都会把内部字段都初始化为0。 到此,一个值类型也做好了。...再比如说,作为引用类型的字段的值类型,都有一个相对于该引用类型地址的偏移量,这个偏移量也是早在编译时就固定下来的。所以,new操作符无需返回值类型实例的地址。
Supplier None T 工厂方法-返回一个对象 UnaryOperator T T 入参和出参都是相同对象的函数 BinaryOperator (T,T) T 求两个对象的操作结果...为什么要先从函数接口说起呢?...javac 的类型推断机制如下: 对于类中有重载的方法,javac 在推断类型时,会挑出最具体的类型。...Stream 是用函数式编程方式在集合类上进行复杂操作的工具。 对于需要大量数值运算的算法来说, 装箱和拆箱的计算开销, 以及装箱类型占用的额外内存, 会明显减缓程序的运行速度。...Java8 对为 null 的字段也引进了自己的处理,既不用一直用 if 判断对象是否为 null,来看看?
中的各个配置创建不同的 pc 规则映射列表 找到对应 Converter,然后通过反射创建此对象,然后放在 patternConverters 中去。...这里有两个条件会产生这个 Converter 配置 "xEx", "xThrowable", "xException" log4j2 的配置文件中 PatternLayout 如果配置了 "xEx",...没有配置 %throwable 时会创建 为什么?来看下一段代码: // 给 PatternLayout 创建对应的 PatternFormatter,用于在输出日志时按指定的规则输出。...converter 差异分析 不同 PatternConverter 的作用是在日志输出时做相应数据的 format,所以对应 PatternConverter 来说,核心的方法就是 format 方法...ThrowableProxy 对象实例时会去对堆栈中的数据进行序列化操作构建 CacheEntry(toExtendedStackTrace),从而触发类加载动作。
URLClassLoader在构造时,有URL[]数组参数,它内部会用这个数组来构造一个URLClassPath: URLClassPath ucp = new URLClassPath(urls);...在 URLClassPath 内部会为这些URLS 都构造一个Loader,然后在getResource时,会从这些Loader里一个个去尝试获取。.../7u40-b43/sun/misc/URLClassPath.java#506 在IDE/开放目录启动Spring boot应用 在上面只提到在一个fat jar里启动Spring boot应用的过程...在IDE里,直接运行的Main函数是应用自己的Main函数: @SpringBootApplication public class SpringBootDemoApplication { public...在org.springframework.boot.logging包下面。 获取原始启动的main函数 通过堆栈里获取的方式,判断main函数,找到原始启动的main函数。
getDelaredConstructors()返回所有class类或接口指定的构造函数; getEnclosingConstructor()返回class类的构造方法中的一个本地或匿名类...; getModifiers()返回对象的java修饰符; getName()以字符串的形式返回构造方法的名称; newInstance()实例化对象;...getDeclaredFields()获取本类的全部属性; getMethod()获取类中的方法对象; Field类: 获取反射字段的方式:getDeclaredField...(),getFields(); getName()获取字段名; getType()获取字段类型; get()获取字段的值; set()设置字段的值...LINKS リフレクションを使って文字列からリソースIDを取得する JAVA反射 Java Reflection(反射机制)详解 Java 反射 使用总结 关于Android中根据ID名动态获取资源的两个方法
为什么在Android中滥用静态变量会导致问题?...浅复制 (Shallow Copy):只复制对象本身(以及其内基本数据类型的值),但对于对象内部的引用类型字段,复制的是其地址而非创建新对象。Java 中的 clone() 方法默认是浅复制。...深复制 (Deep Copy):不仅复制对象本身,还递归地复制其所有引用类型字段指向的对象,生成一个完全独立的副本。适用场景:需要完全隔离新旧数据,任何对新数据的修改都不应影响原始数据。...这些从坑里爬出来的经验,让我对Java的内存模型、对象引用、生命周期有了更立体和深刻的理解,写出的代码也从此变得更加可靠和易于维护。为什么这两个问题需要被放在一起考虑?...这两个问题看似独立,实则共同指向数据安全与生命周期管理的核心矛盾,属于同一类问题的不同表现形式。这两个问题本质上是数据所有权与传递方式的不同表现:Static变量滥用:关注数据的全局共享风险。
mPackageInfo.getApplication() : mMainThread.getApplication(); } } 从代码中可以看出,getApplicationContext 的返回值可能有两个...:第一个是 LoadedApk 的 getApplication 方法,这个方法的返回值就是刚刚创建的 Application 对象;第二个是 ActivityThread 的 getApplication...为什么不推荐使用 Base Context?...一般情况下,使用代理而不直接使用某个对象,目的可能有两个: 定制自己的行为 不影响原对象 其中 Servcie 和 Application 的父类 ContextWrapper 完全没有自定义的行为,而...的 getResource 方法返回的和 getBaseContext().getResources() 方法返回的不是同一个对象 小结 Activity、Service 和 Application
super.getResources() : mResources; } 在 AppcompatActivity 中,有一个 getResources 方法用来获取 Resource。...//返回应用程序包的Resources实例 public abstract Resources getResources(); 他的实现类其实就是 ContextImpl ,这个类在 as 上面是看不到的...1,2,3,4 ,这四个位置调用的是两个方法,这两个方法最终都会通过下面这句话创建 Resource // 创建一个新的资源引用并使用现有的ResourcesImpl对象 Resources resources...new 的对象,-> 其中有一个很重要的参数 AssetManager,这个类是时 Resource核心的实例。...Environment.getExternalStorageDirectory().absolutePath}${File.separator}red.skin" ) //创建一个 Resource,具体的做法在源码中有
02 通过跟踪,对比全屏和分屏下出错的流程,发现问题点在于updateToolbarVisibility 函数的调用上,全屏下会调用这个show,而出错的在分屏下的底部时,没有调用。 ?...03 让我们停止怀疑人生,继续来追踪 mContext.getResources().getDisplayMetrics().heightPixels 为什么会给错呢?...mContext.getResources() 找到这个方法实现的地方,通过断点,找到此处的mContext在ContextImpl.java里面 ?...于是在ContextImpl的构造函数设置断点,发现确实此处传递的overrideConfiguration参数中有我们需要的错误值。 因此可以断定,此处之前已经有问题啦。 ?...于是我们向上跟踪,发现修改地方在setTaskFromReuseOrCreateNewTask函数里面,继续跟进去看: ? ?
2,也就是使去构造一个对象。...那么主要任务还是注释3通过newInstance函数来完成一个Unbinder对象的创建。...所以我们的泛型返回值的上界也就能够确定了。...MainActivity_ViewBinding(MainActivity target) { this(target, target.getWindow().getDecorView()); } // 绑定,这里存在两个函数是不是似曾相识呢...,那我们也就找到了我们的目标了,不过我们这个类中只用关注两个函数作为切入点。