Skip to content

Commit 0d2545f

Browse files
committed
第1周-作业1(选做)
1 parent 672a304 commit 0d2545f

File tree

3 files changed

+107
-6
lines changed

3 files changed

+107
-6
lines changed

‎01jvm/Hello.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
publicclassHello{
2+
publicstaticvoidmain(String[] args){
3+
intnum1 = 1; // 字面量1;
4+
doublenum2 = 2.0D; // 大小写的D都可以
5+
longnum3 = 3L; // 大小写的L都可以, 加L是好习惯;
6+
bytenum4 = 4; // 可以直接赋予 [-128, 127] 范围内的字面量;
7+
if ("".length() < 10){
8+
// 错误用法: num2 + num3 = 2.03
9+
System.out.println("错误用法: num2 + num3 = " + num2 + num3);
10+
}
11+
for (inti = 0; i < num1; i++){
12+
// 四则运算: num1 * num4 = 4
13+
System.out.print("四则运算: num1 * num4 = ");
14+
System.out.println(num1 * num4);
15+
}
16+
}
17+
}

‎01jvm/README.md‎

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
## 作业内容
77

88

9-
> Week01 作业题目(周四)
9+
> Week01 作业题目:
1010
1111
1.(选做)自己写一个简单的 Hello.java,里面需要涉及基本类型,四则运行,if 和 for,然后自己分析一下对应的字节码,有问题群里讨论。
1212

@@ -18,24 +18,34 @@
1818

1919
注意:如果没有线上系统,可以自己 run 一个 web/java 项目。
2020

21-
> Week01 作业题目(周六):
21+
> Week01 作业题目:
2222
2323
1.(选做)本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况。
2424

2525

2626
## 操作步骤
2727

2828

29-
### 作业2
29+
### 作业1(选做)
30+
31+
1. 编写代码, 根据自己的意愿随意编写, 可参考: [Hello.java](./Hello.java)
32+
2. 编译代码, 执行命令: `javac -g Hello.java`
33+
3. 查看反编译的代码。
34+
- 3.1 可以安装并使用idea的jclasslib插件, 选中 [Hello.java](./Hello.java) 文件, 选择 `View --> Show Bytecode With jclasslib` 即可。
35+
- 3.2 或者直接通过命令行工具 javap, 执行命令: `javap -v Hello.class`
36+
4. 分析相关的字节码。【此步骤需要各位同学自己进行分析】
37+
38+
39+
### 作业2(必做)
3040

3141
1. 打开 Spring 官网: https://spring.io/
3242
2. 找到 Projects --> Spring Initializr: https://start.spring.io/
3343
3. 填写项目信息, 生成 maven 项目; 下载并解压。
3444
4. Idea或者Eclipse从已有的Source导入Maven项目。
35-
5.增加课程资源 Hello.xlass 文件到 src/main/resources 目录。
36-
6. 编写代码,实现 findClass 方法,解码方法
45+
5.从课件资料中找到资源 Hello.xlass 文件并复制到 src/main/resources 目录。
46+
6. 编写代码,实现 findClass 方法,以及对应的解码方法
3747
7. 编写main方法,调用 loadClass 方法;
3848
8. 创建实例,以及调用方法
3949
9. 执行.
4050

41-
具体的参见: [https://github.com/renfufei/JAVA-000/blob/main/Week_01/homework01/src/main/java/com/renfufei/homework01/XlassLoader.java](XlassLoader.java)
51+
具体代码可参考: [XlassLoader.java](./XlassLoader.java)

‎01jvm/XlassLoader.java‎

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
importjava.io.Closeable;
2+
importjava.io.IOException;
3+
importjava.io.InputStream;
4+
importjava.lang.reflect.Method;
5+
6+
/*
7+
第一周作业:
8+
2.(必做)自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法,此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。
9+
*/
10+
publicclassXlassLoaderextendsClassLoader{
11+
12+
publicstaticvoidmain(String[] args) throwsException{
13+
// 相关参数
14+
finalStringclassName = "Hello";
15+
finalStringmethodName = "hello";
16+
// 创建类加载器
17+
ClassLoaderclassLoader = newXlassLoader();
18+
// 加载相应的类
19+
Class<?> clazz = classLoader.loadClass(className);
20+
// 看看里面有些什么方法
21+
for (Methodm : clazz.getDeclaredMethods()){
22+
System.out.println(clazz.getSimpleName() + "." + m.getName());
23+
}
24+
// 创建对象
25+
Objectinstance = clazz.getDeclaredConstructor().newInstance();
26+
// 调用实例方法
27+
Methodmethod = clazz.getMethod(methodName);
28+
method.invoke(instance);
29+
}
30+
31+
@Override
32+
protectedClass<?> findClass(Stringname) throwsClassNotFoundException{
33+
// 如果支持包名, 则需要进行路径转换
34+
StringresourcePath = name.replace(".", "/");
35+
// 文件后缀
36+
finalStringsuffix = ".xlass";
37+
// 获取输入流
38+
InputStreaminputStream = this.getClass().getClassLoader().getResourceAsStream(resourcePath + suffix);
39+
try{
40+
// 读取数据
41+
intlength = inputStream.available();
42+
byte[] byteArray = newbyte[length];
43+
inputStream.read(byteArray);
44+
// 转换
45+
byte[] classBytes = decode(byteArray);
46+
// 通知底层定义这个类
47+
returndefineClass(name, classBytes, 0, classBytes.length);
48+
} catch (IOExceptione){
49+
thrownewClassNotFoundException(name, e);
50+
} finally{
51+
close(inputStream);
52+
}
53+
}
54+
55+
// 解码
56+
privatestaticbyte[] decode(byte[] byteArray){
57+
byte[] targetArray = newbyte[byteArray.length];
58+
for (inti = 0; i < byteArray.length; i++){
59+
targetArray[i] = (byte) (255 - byteArray[i]);
60+
}
61+
returntargetArray;
62+
}
63+
64+
// 关闭
65+
privatestaticvoidclose(Closeableres){
66+
if (null != res){
67+
try{
68+
res.close();
69+
} catch (IOExceptione){
70+
e.printStackTrace();
71+
}
72+
}
73+
}
74+
}

0 commit comments

Comments
(0)