Classloader全解析
关于本文
Java内置ClassLoader
Java ClassLoader加载过程
自定义ClassLoader
基本概念
A class loader is an java object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a “class file” of that name from a file system.
Classloader是用于加载class的对象,接受一个class的binary name寻找或者生成该类的2 ...
Gradle启动之gradle-wrapper
Gradle启动之gradle-wrapper
gradle-wrapper即gradle的包装器。
gradle它完成了gradle的环境配置以及gradle的启动。(也就是说到这一步gradle才开始启动起来)
EntryPoint
前面分析到了,gradlew shell脚本执行java 程序启动了gradle-wrapper.jar,接着就从这里开始进行分析。
代码量还是比较少的。
美中不足的是没有gradle-wrapper的源代码,代码没注释可读性稍差,不过好在逻辑简单。就不去翻gradle源码了。
Notes:
如果对代码有洁癖的bro,可以打开gradle源代码
subprojects/wapper
subprojects/cli
subprojects/wrapper-shared
1234567891011121314151617181920212223242526272829public static void main(String[] args) throws Exception { //获取ja ...
Gradle启动之批处理
Gradle启动之批处理
Gradle启动无非是通过shell或者bat脚本,所有要看懂启动逻辑,先了解下基础语法
Shell基础变量自定义变量
变量定义
1variable="value"
定义非常简单,变量名=值,值得注意的是变量名和等号间不能有空格,名称必须遵循如下规则。
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 **_**。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
变量使用
12echo $variableecho ${variable}
$variable即可,echo表示打印传入的值。
echo $variable表明打印变量
预定义特殊变量
$0:是指你所写的shell脚本本身的名字;
$1:是指你写的shell脚本所传入的第一个参数 ;
$2:是指你写的shell脚本所传入的第二个参数
$#: 传递到脚本或函数的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数
$$: 脚本运行的当前进程ID号 ...
Gradle源码环境搭建
Gradle源码阅读环境搭建
接触了很长一段时间的gradle,也看过一部分源码,但是总是感觉差了点东西,所以重新阅读,并以写作的方式加深理解。
源码下载需要准备两个东西
gradle v7.6源代码
配置gradle-wrapper.properties
12345distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists
note:
一定要选择gradle-7.6-all,没有all表示只有二进制没有源文件,debug的时候就看不到源文件。
其中gradle v7.6源代码不是必须的,主要是为了防止idea抽风。有时候代码看不了。其实gradle-wrapper.properties配置的gradle-7.6-all.zip就已经包含了gr ...
Docker Compose
Docker Compose
Compose是一个用于管理多容器的工具,仅用一个yaml文件,一条指令即可创建,开启,停止所有的服务
Docker Compose 文件语法
Compose 文件是一个yaml格式的文件。文件内容包含version,services,networks,volumns,configs,secrets
yaml多行缩进
一种描述数据的标记语言,类似于xml,json等。
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:
123456789101112131415house: family: name: Doe parents: - John - Jane children: - Paul - Mark - Simone address: number: 34 street: Main Street city: Nowheretown zipc ...
SSH基础
SSH证书通过ssh-keygen生成证书1ssh-keygen -t rsa -b 4096
note:
-t 表述加密方式(dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa)
-b表示输出的密钥的长度
接着会弹出对话框
Enter file in which to save the key (/root/.ssh/id_rsa): ssh-test (输入key文件的名称)
密码(这里不设置)
Enter passphrase (empty for no passphrase):Enter same passphrase again:
当前路径即刻生成了rsa的公钥以及私钥
total 8.0K-rw——- 1 root root 3.4K Feb 3 19:05 ssh-test-rw-r–r– 1 root root 741 Feb 3 19:05 ssh-test.pub
配置ssh1vim ~/.ssh/config
1234Host 别名 HostName ...
CA证书那点事
CA证书
CA证书是https必不可少的东西,它包含了非对称加密的公钥信息,以及证书持有方的基本信息,以及颁发机构的信息。主要还是为了保证公钥的权威性,确保公钥的来源是可信的。
证书类型
der: .DER = DER扩展用于二进制DER编码证书。这些文件也可能承载CER或CRT扩展。
pem:使⽤Base64 ASCII进⾏编码的纯⽂本格式,是以“ - BEGIN …”前缀的ASCII(Base64)数据。
key:.KEY 扩展名用于公钥和私钥,常见使用于私钥。也可以被编码为二进制DER或ASCII PEM。
crs:证书签名请求。CSR文件是申请SSL证书时所需要的一个数据文件。
crt:CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。通俗来讲,.CRT文件常在Linux系统使用,包含公钥和主体信息。
crt:.CRT的替代形式,您可以在微软系统环境下将.CRT转换为.CER(.both DER编码的.CER,或base64 [PEM]编码的.cer)。通俗来讲,就是.C ...
Java之并发安全
线程安全线程安全问题
即多线程并发出现稀奇古怪无法理解的问题。
如何解决线程安全问题?
只要并发满足如下性质即可
可见性
即一个线程对一个变量修改后其余所有线程能立即知晓这个变量被修改了。
这句描述可能很奇怪?难道我一个线程修改了一个变量,其他线程难道还不知道吗?
不妨运行一下这个代码。
12345678910111213141516public class Visibility { static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(()->{ while (flag); }).start(); Thread.sleep(1000); flag = false; }}
如果真的满足可见性,那么程序就立即退出了。如果不满足,那么程序就会一直运行下去。
运行结 ...
Kotlin反射
reflection
reflection又叫反射,Kotlin reflection不是对java反射的重写,因为java反射逻辑实现依靠jvm实现的,重写就意味着摒弃.
kotlin reflection是对于java反射的扩展
为什么需要扩展因为kotlin运行在jvm虚拟机上,kotlin真正独特的是它的编译器,它的海量的的语法特性都是通过编译器来提供支持的。
正是由于又有了这些语法特性使得kotlin成为了一门独特的语言,有很多地方他和java是类似的,但是又有很多地方是不相同的.
而jvm并不认识kotlin,对于kotlin的一些如data class,suspend,inline,sealed class显然是不能识别的,但是如果需要对这些类型进行特定的处理,那…显然是困难的
所以就有了kotlin reflection对于java反射的增强
如何引入kotlin reflectionkotlin reflection的支持需要引入一个依赖
123dependencies { implementation("org.jetbrains.k ...
Kotlin ::操作符
::操作符::操作符可以干嘛?或者说是用来干什么的?
它是用于指向一个已经定义的函数或者属性的.
引用函数::可引用的函数分为两类
top-level即顶层函数
成员函数
顶层函数12345678fun main() { val function = ::function function.invoke()}fun function() {}
产物这一看不知道的还以为是lambda(你说他是lambda也没啥问题)
实现原理首先还得是反编译啊
还是看字节码吧
123456789101112131415public final static main()V L0 #获取静态变量TestKt$main$function$1.INSTANCE GETSTATIC TestKt$main$function$1.INSTANCE : LTestKt$main$function$1; ASTORE 0 L1 ALOAD 0 #强转为kotlin的lambda类型接口 CHECKCAST kot ...