Skip to content

Commit 90bfef7

Browse files
committed
[add] add examples of class loading in jvm module
1 parent 6840e59 commit 90bfef7

File tree

9 files changed

+134
-5
lines changed

9 files changed

+134
-5
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.brianway.learning.java.jvm.classloading;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
6+
/**
7+
* Created by brian on 17/3/20.
8+
* 不同的类加载器对 instanceof 关键字运算结果的影响
9+
*/
10+
public class ClassLoaderTest {
11+
public static void main(String[] args) throws Exception {
12+
ClassLoader myLoader = new ClassLoader() {
13+
@Override
14+
public Class<?> loadClass(String name) throws ClassNotFoundException {
15+
try {
16+
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
17+
18+
InputStream is = getClass().getResourceAsStream(fileName);
19+
if (is == null) {
20+
return super.loadClass(name);
21+
}
22+
byte[] b = new byte[is.available()];
23+
is.read(b);
24+
return defineClass(name, b, 0, b.length);
25+
} catch (IOException e) {
26+
throw new ClassNotFoundException(name);
27+
}
28+
}
29+
};
30+
31+
Object obj = myLoader.loadClass("com.brianway.learning.java.jvm.classloading.ClassLoaderTest").newInstance();
32+
System.out.println(obj.getClass());
33+
System.out.println(obj instanceof com.brianway.learning.java.jvm.classloading.ClassLoaderTest);
34+
}
35+
}
36+
37+
/*
38+
class com.brianway.learning.java.jvm.classloading.ClassLoaderTest
39+
false
40+
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.brianway.learning.java.jvm.classloading;
2+
3+
/**
4+
* Created by brian on 17/3/20.
5+
* <clinit>() 方法执行顺序
6+
*/
7+
public class ClinitOrder {
8+
static class Parent {
9+
public static int A = 1;
10+
11+
static {
12+
System.out.println("execute before A = 2, A now is " + A);
13+
A = 2;
14+
}
15+
}
16+
17+
static class Sub extends Parent {
18+
public static int B = A;
19+
}
20+
21+
22+
public static void main(String[] args) {
23+
System.out.println(Sub.B);
24+
}
25+
}
26+
27+

java-jvm/src/main/java/com/brianway/learning/java/jvm/classfile/ConstClass.java renamed to java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/ConstClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.brianway.learning.java.jvm.classfile;
1+
package com.brianway.learning.java.jvm.classloading;
22

33
/**
44
* Created by brian on 17/3/19.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.brianway.learning.java.jvm.classloading;
2+
3+
/**
4+
* Created by brian on 17/3/20.
5+
* 字段解析
6+
* 多个线程同时初始化一个类,只有一个线程会执行 <clinit>()方法,其他被阻塞
7+
*/
8+
public class DeadLoopClass {
9+
static {
10+
if (true) {
11+
System.out.println(Thread.currentThread() + " init DeadLoopClass");
12+
while (true) {
13+
14+
}
15+
}
16+
}
17+
18+
public static void main(String[] args) {
19+
Runnable script = () -> {
20+
System.out.println(Thread.currentThread() + " start");
21+
DeadLoopClass dlc = new DeadLoopClass();
22+
System.out.println(Thread.currentThread() + " run over");
23+
};
24+
25+
Thread thread1 = new Thread(script);
26+
Thread thread2 = new Thread(script);
27+
thread1.start();
28+
thread2.start();
29+
}
30+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.brianway.learning.java.jvm.classloading;
2+
3+
/**
4+
* Created by brian on 17/3/20.
5+
* 字段解析
6+
* 如果注释了 Sub 类中的 "public static int A = 4",会编译错误
7+
*/
8+
public class FieldResolution {
9+
interface Interface0 {
10+
int A = 0;
11+
}
12+
13+
interface Interface1 extends Interface0 {
14+
int A = 1;
15+
}
16+
17+
interface Interface2 {
18+
int A = 2;
19+
}
20+
21+
static class Parent implements Interface1 {
22+
public static int A = 3;
23+
}
24+
25+
static class Sub extends Parent implements Interface2 {
26+
public static int A = 4;// 注释此句试试
27+
}
28+
29+
public static void main(String[] args) {
30+
System.out.println(Sub.A);
31+
}
32+
}

java-jvm/src/main/java/com/brianway/learning/java/jvm/classfile/NoInitialization.java renamed to java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/NoInitialization.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.brianway.learning.java.jvm.classfile;
1+
package com.brianway.learning.java.jvm.classloading;
22

33
/**
44
* Created by brian on 17/3/19.

java-jvm/src/main/java/com/brianway/learning/java/jvm/classfile/SimpleClass.java renamed to java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SimpleClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.brianway.learning.java.jvm.classfile;
1+
package com.brianway.learning.java.jvm.classloading;
22

33
/**
44
* Created by brian on 17/3/15.

java-jvm/src/main/java/com/brianway/learning/java/jvm/classfile/SubClass.java renamed to java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SubClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.brianway.learning.java.jvm.classfile;
1+
package com.brianway.learning.java.jvm.classloading;
22

33
/**
44
* Created by brian on 17/3/19.

java-jvm/src/main/java/com/brianway/learning/java/jvm/classfile/SuperClass.java renamed to java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SuperClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.brianway.learning.java.jvm.classfile;
1+
package com.brianway.learning.java.jvm.classloading;
22

33
/**
44
* Created by brian on 17/3/19.

0 commit comments

Comments
 (0)