写点什么

Java 训练营第一周习题:02 加载字节码文件

发布于: 2021 年 02 月 23 日

题目

自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法,此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。

Hello.xlass 文件:链接: https://pan.baidu.com/s/1vc8QJA7DE8XhnvOfHk-ARw 提取码: cycm

程序源码

package Week_01;
import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;
/** * 自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法, * 此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。 */public class HelloClassLoader extends ClassLoader { public static void main(String[] args) { try { Class<?> helloClass = new HelloClassLoader().findClass("Hello"); Method helloMethod = helloClass.getMethod("hello"); helloMethod.invoke(helloClass.newInstance()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
@Override protected Class<?> findClass(String name) throws ClassNotFoundException {
Path path = Paths.get("/Users/zhanghongang/Study/GeekBang/JavaCourse/JAVA-Homework/Week_01/Week_01/Hello.xlass"); byte[] helloBase64 = new byte[0]; try { helloBase64 = Files.readAllBytes(path); } catch (IOException e) { e.printStackTrace(); }
for (int i = 0; i < helloBase64.length; i++) { helloBase64[i] = (byte) (255 - helloBase64[i]); }
return defineClass(name, helloBase64, 0, helloBase64.length); }}
复制代码


发布于: 2021 年 02 月 23 日阅读数: 26
用户头像

因为只会扯淡,还扯不好淡,所有想扯点什么 2017.11.30 加入

还未添加个人简介

评论

发布
暂无评论
Java 训练营第一周习题:02 加载字节码文件