From dc58232db18f750aa2117951b384fccd208d78fb Mon Sep 17 00:00:00 2001 From: wbq813 Date: Wed, 5 Feb 2020 22:32:01 +0800 Subject: [PATCH] =?UTF-8?q?[Fix]=20=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 30 ++- README.md | 6 +- ...50\346\200\201\347\274\226\350\257\221.md" | 2 +- doc/ClassFile.md | 7 + doc/Reflec&Introspector.md | 199 ++++++++++++++++++ doc/pic/class_code.PNG | Bin 0 -> 21568 bytes doc/pic/constant_data_type.png | Bin 0 -> 57124 bytes .../codeyourlife/execute/ClassModifier.java | 26 ++- .../execute/JavaClassExecutor.java | 5 +- .../service/ExecuteStringSourceService.java | 7 +- 10 files changed, 258 insertions(+), 24 deletions(-) create mode 100644 doc/ClassFile.md create mode 100644 doc/Reflec&Introspector.md create mode 100644 doc/pic/class_code.PNG create mode 100644 doc/pic/constant_data_type.png diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6764f76..2224a59 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,16 @@ + + + + - - + + + + @@ -192,6 +209,11 @@ 22 diff --git a/README.md b/README.md index dcf94fb..a466f28 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,10 @@ 本项目基于 Netty+FastJson 实现了一个在线的 Java IDE,可以远程运行客户端发来的 Java 代码的 main 方法,并将程序的标准输出内容、运行时异常信息反馈给客户端,并且会对客户端发来的程序的执行时间进行限制。 -项目中涉及的框架相关知识并不多,主要涉及了许多 Java 基础的知识,如:Java 程序编译和运行的过程、Java 类加载机制、Java 类文件结构、Java 反射等。除此之外,还涉及到了一个简单的并发问题:如何将一个非线程安全的类变为一个线程安全的类。因此,本项目较为适合在比较注重基础的面试中介绍给面试官,可以引出一些 Java 虚拟机,Java 并发相关的问题,较能体现应聘者对于 Java 的一些原理性的知识的掌握程度。在本篇文章中,我们尽可能的将用到的知识简单讲解一下或者给出讲解的链接,以方便大家阅读。 +项目中涉及的框架相关知识并不多,主要涉及了许多 Java 基础的知识,如:Java 程序编译和运行的过程、Java 类加载机制、Java 类文件结构、Java 反射等。除此之外,还涉及到了一个简单的并发问题:如何将一个非线程安全的类变为一个线程安全的类。因此,本项目较为适合在比较注重基础的面试中介绍给面试官,可以引出一些 Java 虚拟机,Java 并发相关的问题,较能体现应聘者对于 Java 的一些原理性的知识的掌握程度。 ## TODO -1. 完善页面 - #### 运行效果 ![项目展示](./doc/pic/demo.png) @@ -66,7 +64,7 @@ Java 类运行的过程可分为两个过程: - 关于类加载器的详细讲解可见:[虚拟机类加载机制](https://github.com/TangBean/understanding-the-jvm/blob/master/Ch2-Java%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C/01-%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6.md)。 - **类的执行** - JVM 找到 Test 的主函数入口,开始执行 main 函数。 - - 本项目主要通过反射来完成这一过程,有关反射的详细讲解可见:[Java 反射](https://github.com/TangBean/SimpleSpring/blob/master/doc/011-%E5%8F%8D%E5%B0%84%E4%B8%8E%E5%86%85%E7%9C%81.md#%E5%8F%8D%E5%B0%84-reflect)。 + - 本项目主要通过反射来完成这一过程,有关反射的详细讲解可见:[Java 反射](doc/Reflec&Introspector.md)。 在了解 Java 程序的实际运行过程之后,我们接下来要考虑的是:如何在运行过程中实现这一流程?也就是说,我们要在服务器端程序运行的过程中完成客户端代码发来的代码的编译和运行。通过对上图中 Java 程序编译和运行流程进行分析,我们得到以下客户端 Java 源代码执行流程: diff --git "a/doc/01-\345\212\250\346\200\201\347\274\226\350\257\221.md" "b/doc/01-\345\212\250\346\200\201\347\274\226\350\257\221.md" index ae59fa8..8ff991e 100644 --- "a/doc/01-\345\212\250\346\200\201\347\274\226\350\257\221.md" +++ "b/doc/01-\345\212\250\346\200\201\347\274\226\350\257\221.md" @@ -13,7 +13,7 @@ -从 JDK 1.6 开始,引入了 Java 代码重写的编译接口,使得我们可以在运行时编译 Java 代码,然后在通过类加载器将编译好的类加载进 JVM,这种在运行时编译代码的操作就叫做动态编译。 +从 JDK 1.6 开始,引入了 Java 代码重写的编译接口,使得我们可以在运行时编译 Java 代码,然后再通过类加载器将编译好的类加载进 JVM,这种在运行时编译代码的操作就叫做动态编译。 通过使用动态编译,可以将源代码的字符串直接编译为字节码,在没有动态编译之前,想要在运行过程中编译 Java 源代码,我们要先将源代码写入一个 .java 文件,通过 javac 编译这个文件,得到 .class 文件,然后将 .class 文件通过 ClassLoader 加载进内存,才能得到 Class 对象。这其中存在两个问题:一是会生成 .java 和 .class 两个文件,运行之后还要把它们删除,以防止污染我们的服务器环境;二是会生成文件也就是说涉及 IO 操作,这个操作比起一切都在内存中运行是十分耗时的。所以我们使用了 Java 的动态编译技术,跳过了这两个文件的生成过程,直接在内存中将源代码字符串编译为字节码的字节数组,这样既不会污染环境,又不会额外的引入 IO 操作,一举两得。 diff --git a/doc/ClassFile.md b/doc/ClassFile.md new file mode 100644 index 0000000..647bdab --- /dev/null +++ b/doc/ClassFile.md @@ -0,0 +1,7 @@ +# 类文件结构 + +![类文件结构](pic/class_code.png) + +常量池的起始位置是10,8-9是常量的个数,下表展示常量项的类型。 + +![常量池数据类型](pic/constant_data_type.png) \ No newline at end of file diff --git a/doc/Reflec&Introspector.md b/doc/Reflec&Introspector.md new file mode 100644 index 0000000..0a1d400 --- /dev/null +++ b/doc/Reflec&Introspector.md @@ -0,0 +1,199 @@ +# 反射与内省 + + + +- [反射与内省](#%E5%8F%8D%E5%B0%84%E4%B8%8E%E5%86%85%E7%9C%81) + - [反射 (Reflect)](#%E5%8F%8D%E5%B0%84-reflect) + - [反射的原理](#%E5%8F%8D%E5%B0%84%E7%9A%84%E5%8E%9F%E7%90%86) + - [使用反射操作属性](#%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%B0%84%E6%93%8D%E4%BD%9C%E5%B1%9E%E6%80%A7) + - [使用反射操作构造函数](#%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%B0%84%E6%93%8D%E4%BD%9C%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0) + - [无参数构造方法](#%E6%97%A0%E5%8F%82%E6%95%B0%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95) + - [有参数构造方法](#%E6%9C%89%E5%8F%82%E6%95%B0%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95) + - [使用反射操作方法](#%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%B0%84%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95) + - [实例方法](#%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95) + - [静态方法](#%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95) + - [内省 (Introspector)](#%E5%86%85%E7%9C%81-introspector) + - [JavaBean的规范](#javabean%E7%9A%84%E8%A7%84%E8%8C%83) + - [Introspector操作JavaBean](#introspector%E6%93%8D%E4%BD%9Cjavabean) + - [使用BeanUtils](#%E4%BD%BF%E7%94%A8beanutils) + - [设置JavaBean属性:`BeanUtils.setProperty(bean, propertyName, propertyValue)`](#%E8%AE%BE%E7%BD%AEjavabean%E5%B1%9E%E6%80%A7beanutilssetpropertybean-propertyname-propertyvalue) + - [获取JavaBean属性:`BeanUtils.getProperty(bean, propertyName)`](#%E8%8E%B7%E5%8F%96javabean%E5%B1%9E%E6%80%A7beanutilsgetpropertybean-propertyname) + - [封装Map数据到JavaBean对象中:`BeanUtils.populate(bean, map)`](#%E5%B0%81%E8%A3%85map%E6%95%B0%E6%8D%AE%E5%88%B0javabean%E5%AF%B9%E8%B1%A1%E4%B8%ADbeanutilspopulatebean-map) + - [反射和内省的区别](#%E5%8F%8D%E5%B0%84%E5%92%8C%E5%86%85%E7%9C%81%E7%9A%84%E5%8C%BA%E5%88%AB) + + + +## 反射 (Reflect) + +在框架开发中,都是基于配置文件开发的,在配置文件中配置了类,可以通过读取配置文件中的类名,然后通过反射得到类中的所有内容,或是让类中的某个方法来执行。 + +也就是说,反射是在运行时获取一个类的所有信息,可以获取到 .class 的任何定义的信息(包括成员 变量,成员方法,构造器等)可以操纵类的字段、方法、构造器等部分。 + +### 反射的原理 + +我们将通过下图对反射的原理进行说明: + +![反射的原理.png](./pic/反射的原理.png) + +- **得到 class 文件** + - 把 java 文件保存到本地硬盘,得到 .java 文件 + - 编译 java 文件,得到 .class 文件 + +- **通过 class 文件得到 Class 类**,可以通过以下 3 种方式获得 Class 类 + + JVM 把 .class 文件加载到内存中,class 文件在内存中使用 Class 类表示 + + - 通过成员变量获得: `类名.class` + - 通过具体对象获得: `对象.getClass()` + - 通过 Class 的静态方法获取: `Class.forName("classFilePath")` + +- **通过 Class 类获取 class 文件中的内容,包括:成员变量,构造方法,普通方法**,它们都可以用相应的类表示: + + - 属性:`Field` + - 构造方法:`Constructor` + - 普通方法:`Method` + +### 使用反射操作属性 + +```java +public void test3() { + try { + Class c2 = Class.forName("cn.itcast.test09.Person"); // 得到Class类 + Person p11 = (Person) c2.newInstance(); // 得到Person类的对象,返回 + Field[] fields = c2.getDeclaredFields(); // 得到所有的属性,返回一个Field数组 + Field f1 = c2.getDeclaredField("name"); // 得到属性,参数是属性的名称 + // 如果操作的是私有的属性,不让操作,可以通过setAccessible(true)操作私有属性 + f1.setAccessible(true); + f1.set(p11, "wangwu"); // 设置name值,相当于p.name = "wangwu"; + System.out.println(f1.get(p11)); // 相当于 p.name + }catch(Exception e) { + e.printStackTrace(); + } +} +``` + +### 使用反射操作构造函数 + +#### 无参数构造方法 + +通过 Class 对象的 `newInstance()` 方法创建。 + +```java +public void test1() throws Exception { + Class c3 = Class.forName("cn.itcast.test09.Person"); + // 无参数的构造方法就是直接使用newInstance()方法 + Person p = (Person) c3.newInstance(); + p.setName("zhangsan"); + System.out.println(p.getName()); +} +``` + +#### 有参数构造方法 + +不能再通过 Class 对象的 `newInstance()` 方法创建了,要先得到要调用的构造函数的 Consturctor 对象,然后通过 Constructor 对象的 `newInstance()` 方法创建。 + +```java +public void test2() throws Exception { + Class c1 = Class.forName("cn.itcast.test09.Person"); + // 获取所有的构造方法 + Constructor[] css = c1.getConstructors(); + // 获取特定的构造方法:传递是有参数的构造方法里面参数类型,类型使用class的形式传递 + Constructor cs = c1.getConstructor(String.class, String.class); + // 通过有参数的构造方法创建Person实例,而不是通过Class的对象 + Person p1 = (Person) cs.newInstance("lisi","100"); + System.out.println(p1.getId()+" "+p1.getName()); +} +``` + + +### 使用反射操作方法 + +#### 实例方法 + +```java +public void test4() throws Exception { + Class c4 = Class.forName("cn.itcast.test09.Person"); + Person p4 = (Person) c4.newInstance(); + // 得到所有的普通方法 + Method[] mds = c4.getDeclaredMethods(); + // 得到特定的普通方法,传递两个参数:第一个参数:方法名称;第二个参数:方法里面参数的类型 + Method m1 = c4.getDeclaredMethod("setName", String.class); + // 使用invoke执行方法,传递两个参数:第一个参数:person实例;第二个参数:设置的值 + // 在这里要传入person对象的原因是:我们需要知道到底是哪一个对象的setName方法执行了 + // 如果要操作的是私有的方法 ,需要 m1.setAccessible(true); + m1.invoke(p4, "niuqi"); + System.out.println(p4.getName()); +} +``` + +#### 静态方法 + +静态方法调用方式是 `类名.方法名`,不需要类的实例,所以使用反射操作静态方式时候,也是不需要实例的,在 invoke 方法的第一个参数传入 null 即可: `m1.invoke(null, "niuqi");` + + +## 内省 (Introspector) + +内省是基于反射实现的,主要用于操作 JavaBean,相比反射使用起来要方便一些。可以获取 bean 的 getter/setter 方法,也就是说,只要 JavaBean 有 `getXxx()` 方法,不管这个 Bean 有没有 Xxx 属性,使用内省我们都认为它有。 + +为了更好的理解,我们先来介绍一下 JavaBean 的规范。 + +### JavaBean 的规范 + +- 必须要有一个默认构造器。 +- 提供 get/set 方法,如果只有 get 方法,那么这个属性是只读属性。 +- 属性:有 get/set 方法的成员,还可以没有成员,只有 get/set 方法。属性名称由 get/set 方法来决定,而不是成员名称。 +- 方法名称满足一定的规范,它就是属性!boolean 类型的属性,它的读方法可以是 is 开头,也可以是 get 开头。 + +### Introspector 操作 JavaBean + +**操作示例:** + +```java +BeanInfo beanInfo = Introspector.getBeanInfo(User.class); +PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); +``` + +每个 PropertyDescriptor 对象对应一个 JavaBean 属性: + +- `String getName()`:获取 JavaBean 属性名称; +- `Method getReadMethod()`:获取属性的读方法; +- `Method getWriteMethod()`:获取属性的写方法。 + +然后再调用`invoke(params...)`就可以操作 JavaBean 了。 + +### 使用 BeanUtils + +我们并不需要真的自己通过 Introspector 来获取 JavaBean 的实例,我们可以通过现成的工具:BeanUtils 来操作 JavaBean。想要使用 BeanUtils,我们需要先导入 commons-beanutils.jar 包,然后,我们便可以通过 BeanUtils 来操纵 JavaBean 了。 + +#### 设置 JavaBean 属性:`BeanUtils.setProperty(bean, propertyName, propertyValue)` + +```java +User user = new User(); +BeanUtils.setProperty(user, "username", "admin"); +BeanUtils.setProperty(user, "password", "admin123"); +``` + +#### 获取 JavaBean 属性:`BeanUtils.getProperty(bean, propertyName)` + +```java +User user = new User("admin", "admin123"); +String username = BeanUtils.getProperty(user, "username"); +String password = BeanUtils.getProperty(user, "password"); +``` + +#### 封装 Map 数据到 JavaBean 对象中:`BeanUtils.populate(bean, map)` + +```java +Map map = new HashMap(); +map.put("username", "admin"); +map.put("password", "admin123"); +User user = new User(); +BeanUtils.populate(user, map); +``` + + +## 反射和内省的区别 + +反射就像给类照镜子,这个的所有信息会毫无保留的反射到镜子中,将这个类的所有信息照出来,能照出来就是有,照不出来就是没有,得到的东西都是客观真实存在的。 + +而内省的目的是找出 bean 的 getter 和 setter 以便操作这个 bean,所以只要看到有 getter 或者 setter 就认为这个类有那么一个字段,比如看到 getName() 内省就会认为这个类中有 name 字段,但事实上并不一定会有 name。 diff --git a/doc/pic/class_code.PNG b/doc/pic/class_code.PNG new file mode 100644 index 0000000000000000000000000000000000000000..769d2ba64e12b5133d4e92c93d393be9585500b2 GIT binary patch literal 21568 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 YEA38URNF}=X#Es9g?F%dYDG-?9oVSsN&o-= literal 0 HcmV?d00001 diff --git a/doc/pic/constant_data_type.png b/doc/pic/constant_data_type.png new file mode 100644 index 0000000000000000000000000000000000000000..889faca3dd4a4b5d71a7cbc53e0ae9d6c6792fab GIT binary patch literal 57124 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 HQ$iB}D*}{p literal 0 HcmV?d00001 diff --git a/src/main/java/cn/codeyourlife/execute/ClassModifier.java b/src/main/java/cn/codeyourlife/execute/ClassModifier.java index ef2a536..a768c4c 100644 --- a/src/main/java/cn/codeyourlife/execute/ClassModifier.java +++ b/src/main/java/cn/codeyourlife/execute/ClassModifier.java @@ -3,18 +3,20 @@ public class ClassModifier { /** * Class文件中常量池的起始偏移 + * cafe babe 0000 0034 + * 魔数 次、主版本号 */ private static final int CONSTANT_POOL_COUNT_INDEX = 8; /** - * CONSTANT_UTF8_INFO常量的tag + * tag为1表示此常量类型为 Utf8字符串。 */ - private static final int CONSTANT_UTF8_INFO = 1; + private static final int CONSTANT_UTF8_TAG = 1; /** - * 常量池中11种常量的长度,CONSTANT_ITEM_LENGTH[tag]表示它的长度 + * tag为2-12对应的常量长度 4,4,8,8,2,2,4,4,4,4 */ - private static final int[] CONSTANT_ITEM_LENGTH = {-1, -1, -1, 5, 5, 9, 9, 3, 3, 5, 5, 5, 5}; + private static final int[] CONSTANT_ITEM_LENGTH = {-1, -1, -1, 4, 4, 8, 8, 2, 2, 4, 4, 4, 4}; /** * 1个和2个字节的符号数,用来在classByte数组中取tag和len @@ -35,6 +37,7 @@ public ClassModifier(byte[] classByte) { /** * 从0x00000008开始向后取2个字节,表示的是常量池中常量的个数 + * * @return 常量池中常量的个数 */ public int getConstantPoolCount() { @@ -43,20 +46,27 @@ public int getConstantPoolCount() { /** * 字节码修改器,替换字节码常量池中 oldStr 为 newStr + * * @param oldStr * @param newStr * @return 修改后的字节码字节数组 */ public byte[] modifyUTF8Constant(String oldStr, String newStr) { + // 获取常量的个数 int cpc = getConstantPoolCount(); - int offset = CONSTANT_POOL_COUNT_INDEX + u2; // 真实的常量起始位置 + // 常量池真实的常量起始位置10 + int offset = CONSTANT_POOL_COUNT_INDEX + u2; for (int i = 1; i < cpc; i++) { int tag = ByteUtils.byte2Int(classByte, offset, u1); - if (tag == CONSTANT_UTF8_INFO) { + if (tag == CONSTANT_UTF8_TAG) { + // Utf8 字符串类型,才可能是对System的调用 + // U2(2字节)表示字符串的长度 int len = ByteUtils.byte2Int(classByte, offset + u1, u2); offset += u1 + u2; + // U1(1字节)*len 的字符串 String str = ByteUtils.byte2String(classByte, offset, len); if (str.equals(oldStr)) { + // 命中需要替换的字符串 byte[] strReplaceBytes = ByteUtils.string2Byte(newStr); byte[] intReplaceBytes = ByteUtils.int2Byte(strReplaceBytes.length, u2); // 替换新的字符串的长度 @@ -68,7 +78,9 @@ public byte[] modifyUTF8Constant(String oldStr, String newStr) { offset += len; } } else { - offset += CONSTANT_ITEM_LENGTH[tag]; + // 另外10种常量类型不用处理 + // 增加tag和index长度的偏移 + offset += u1 + CONSTANT_ITEM_LENGTH[tag]; } } return classByte; diff --git a/src/main/java/cn/codeyourlife/execute/JavaClassExecutor.java b/src/main/java/cn/codeyourlife/execute/JavaClassExecutor.java index 54874be..e9d97b0 100644 --- a/src/main/java/cn/codeyourlife/execute/JavaClassExecutor.java +++ b/src/main/java/cn/codeyourlife/execute/JavaClassExecutor.java @@ -9,7 +9,7 @@ * 1. 清空HackSystem中的缓存 * 2. new ClassModifier,并传入需要被修改的字节数组 * 3. 调用ClassModifier#modifyUTF8Constant修改: - * java/lang/System -> com/jvm/ch9/remoteinvoke/HackSystem + * java/lang/System -> HackSystem * 4. new一个类加载器,把字节数组加载为Class对象 * 5. 通过反射调用Class对象的main方法 * 6. 从HackSystem中获取返回结果 @@ -35,7 +35,8 @@ public static String execute(byte[] classByte, String systemIn) { // 5. 通过反射调用Class对象的main方法 try { - Method mainMethod = clazz.getMethod("main", new Class[] { String[].class }); + // main 函数的参数类型时String类型 + Method mainMethod = clazz.getMethod("main", String[].class); mainMethod.invoke(null, new String[] { null }); } catch (NoSuchMethodException e) { e.printStackTrace(); diff --git a/src/main/java/cn/codeyourlife/service/ExecuteStringSourceService.java b/src/main/java/cn/codeyourlife/service/ExecuteStringSourceService.java index 715bfe3..1ee45f1 100644 --- a/src/main/java/cn/codeyourlife/service/ExecuteStringSourceService.java +++ b/src/main/java/cn/codeyourlife/service/ExecuteStringSourceService.java @@ -46,12 +46,7 @@ public String execute(String source, String systemIn) { } // 运行字节码的main方法 - Callable runTask = new Callable() { - @Override - public String call() throws Exception { - return JavaClassExecutor.execute(classBytes, systemIn); - } - }; + Callable runTask = () -> JavaClassExecutor.execute(classBytes, systemIn); Future res = null; try {