Skip to content

Commit 0c5d23e

Browse files
committed
ignore
1 parent 87c6d38 commit 0c5d23e

3 files changed

Lines changed: 62 additions & 11 deletions

File tree

‎Java/lang/java-lang-Class.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
------------------------
2+
Class |
3+
------------------------
4+
# 类对象
5+
6+
# 静态方法
7+
Class<?> forName(String className)
8+
Class<?> forName(String name, boolean initialize, ClassLoader loader)
9+
* 加载类
10+
className/name 类名称
11+
initialize 是否要初始化, 默认 true
12+
loader 使用自定义的类加载器执行
13+
14+
15+

‎Java/lang/java-lang-ClassLoader.java‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,22 @@ public static Enumeration<URL> getSystemResources(String name)
2020

2121
@Deprecated
2222
protected final Class<?> defineClass(byte[] b, int off, int len)
23-
2423
protected final Class<?> defineClass(String name, byte[] b, int off, int len)
2524
protected final Class<?> defineClass(String name, byte[] b, int off, int len,ProtectionDomain protectionDomain)
2625
protected final Class<?> defineClass(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain)
26+
* 根据字节数据创建一个类
2727

28-
protected Package definePackage(String name, String specTitle,String specVersion, String specVendor, String implTitle, String implVersion,String implVendor, URL sealBase)
29-
3028
protected Class<?> findClass(String name)
29+
* 空的方法, 自己实现的加载器建议覆写该方法
30+
31+
protected Class<?> loadClass(String name, boolean resolve)
32+
public Class<?> loadClass(String name)
33+
* 加载方法
34+
name 类方法名称
35+
resolve 是否解析初始化类
36+
37+
38+
protected Package definePackage(String name, String specTitle,String specVersion, String specVendor, String implTitle, String implVersion,String implVendor, URL sealBase)
3139
protected String findLibrary(String libname)
3240
protected final Class<?> findLoadedClass(String name)
3341
protected URL findResource(String name)
@@ -36,9 +44,7 @@ protected final Class<?> findSystemClass(String name)
3644
protected Object getClassLoadingLock(String className
3745
protected Package getPackage(String name)
3846
protected Package[] getPackages()
39-
protected Class<?> loadClass(String name, boolean resolve)
40-
public Class<?> loadClass(String name)
41-
47+
4248
protected final void setSigners(Class<?> c, Object[] signers)
4349

4450

‎Jvm/jvm-load-类加载器.java‎

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@
1414

1515

1616
# 类加载类型
17-
* 启动类加载器 Boostrap ClassLoader
17+
* 启动类加载器 Bootstrap ClassLoader
1818
* 在 $JAVA_HOME\lib 目录中, 或者通过 -Xbootclasspath 参数指定
1919
* 使用 C++ 实现, 是JVM自身的一部分, 不能被程序代码获取到
20+
* 查看它的加载目录:System.getProperty("sun.boot.class.path")
2021

2122
* 扩展类加载器 Extension ClassLoader
2223
* 由: sun.misc.Launcher$ExtClassLoader 实现, 实现接口:ClassLoader
2324
* 它负责加载 $JAVA_HOME\lib\ext 目录中的, 或者被 java.ext.dirs 系统变量指定的路径中的所有类库
2425
* 开发者可以直接使用扩展类加载器
26+
* 查看它的加载目录:System.getProperty("java.ext.dirs")
2527

2628
* 应用类加载器 Application ClassLoader
2729
* 由: sun.misc.Launcher$AppClassLoader 实现, 实现接口:ClassLoader
@@ -33,7 +35,16 @@
3335

3436
Class<?> driverClass = Class.forName("com.mysql.cj.jdbc.Driver");
3537
System.out.println(driverClass.getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2
36-
38+
39+
* 程序里面获取各个加载器
40+
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
41+
System.out.println(appClassLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2
42+
43+
ClassLoader extClassLoader = appClassLoader.getParent();
44+
System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@cc34f4d
45+
46+
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
47+
System.out.println(bootstrapClassLoader); // null ,C++实现,用户代码无法获取
3748

3849

3950
# 双亲委派机制
@@ -141,6 +152,25 @@ protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundEx
141152

142153

143154

144-
145-
146-
155+
-----------------
156+
ClassLoader |
157+
-----------------
158+
# 自定义类加载器
159+
class MyClassLoader extends ClassLoader {
160+
@Override
161+
protected Class<?> findClass(String name) throws ClassNotFoundException {
162+
// 尝试委托加载
163+
Class<?> clazz = super.loadClass(name);
164+
if (clazz != null){
165+
return clazz;
166+
}
167+
/**
168+
* TODO 自己尝试加载, 如果不存在, 抛出异常:ClassNotFoundException
169+
* TODO 如果存在则获取到字节数据, 转换为类对象
170+
*/
171+
172+
byte[] data = new byte[1024];
173+
clazz = defineClass("", data, 0, data.length);
174+
return clazz;
175+
}
176+
}

0 commit comments

Comments
 (0)