理解java虚拟机的加载机制
创始人
2025-05-28 04:50:50
0
// 反射加载TestHelloWorld示例
Class.forName("com.anbai.sec.classloader.TestHelloWorld");// ClassLoader加载TestHelloWorld示例
this.getClass().getClassLoader().loadClass("com.anbai.sec.classloader.TestHelloWorld");

forName默认会初始化被加载类的静态属性和方法,如果不希望初始化类可以使用Class.forName("类名", 是否初始化类, 类加载器),而ClassLoader.loadClass默认不会初始化类方法。

package com.cxk.load;public class Student {public Student() {System.out.println("进行了初始化构造器");}static {System.out.println("进入了静态方法");}
}进入了静态方法

Java自定义类的加载器 

java的加载机制是双亲委派机制,即从Bootstrap ClassLoader 、Extension ClassLoader、App ClassLoader的顺序,如果要加载一个类时,会先委托它的父类加载器尝试加载,一直网上,如果最上面的父类也没找到该类,那么才会在本加载器加载。

注意这个父类并不是真的继承关系,只是为了方便说明!

 1.为什么要自定义ClassLoader

 因为系统的ClassLoader只会加载指定目录的class文件,如果我们想加载自己的class文件,就可以自定义一个,里面也可以进行一些特殊的操作例如加密解密。

2.调用流程

ClassLoader::loadclass->ClassLoader::findClass->ClassLoader::defineclass

 我们只需要修改中间的findClass就可以了,自定义加载器继承ClassLoader重写findclass方法,然后里面的classDate字节码是我们可控的类,最后调用loadclass方法即可。

package com.cxk.Loader;import java.io.*;public class MyClassLoader extends ClassLoader {//指定路径private String path ;public MyClassLoader(String classPath){path=classPath;}/*** 重写findClass方法* @param name 是我们这个类的全路径* @return* @throws ClassNotFoundException*/@Overrideprotected Class findClass(String name) throws ClassNotFoundException {Class log = null;// 获取该class文件字节码数组byte[] classData = getData();if (classData != null) {// 将class的字节码数组转换成Class类的实例log = defineClass(name, classData, 0, classData.length);}return log;}/*** 将class文件转化为字节码数组* @return*/private byte[] getData() {//主要实现的功能其实就是读取出文件的内容File file = new File(path);if (file.exists()){FileInputStream in = null;ByteArrayOutputStream out = null;try {in = new FileInputStream(file);out = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int size = 0;while ((size = in.read(buffer)) != -1) {out.write(buffer, 0, size);}} catch (IOException e) {e.printStackTrace();} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}return out.toByteArray();}else{return null;}}
}

 这个就是定义类的路径,然后用自定义的加载器加载。

package com.cxk.Loader;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ClassLoaderMain {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {//这个类class的路径String classPath = "E:\\2022java-servlet\\11\\javassist-learn\\src\\main\\java\\com\\cxk\\Loader\\Paul.class";MyClassLoader myClassLoader = new MyClassLoader(classPath);//类的全称String packageNamePath = "com.cxk.Loader.Paul";//加载Log这个class文件Class Log = myClassLoader.loadClass(packageNamePath);System.out.println("类加载器是:" + Log.getClassLoader());//利用反射获取main方法Method method = Log.getDeclaredMethod("main", String[].class);Object object = Log.newInstance();String[] arg = {"ad"};method.invoke(object, (Object) arg);}}

URLClassLoader 提供了远程加载类的功能

除此之外,跨类加载器调用类方法时需要特别注意一个基本原则:ClassLoader A和ClassLoader B可以加载相同类名的类,但是ClassLoader A中的Class A和ClassLoader B中的Class A是完全不同的对象,两者之间调用只能通过反射

 BCEL FastJson攻击链分析

 JavaClass cls = Repository.lookupClass(Evil.class);String code = Utility.encode(cls.getBytes(),true);System.out.println("$$BCEL$$"+code); 加密int    index    = className.indexOf("$$BCEL$$");解密
String realName = className.substring(index + 8);// BCEL解码类字节码
byte[] bytes = com.sun.org.apache.bcel.internal.classfile.Utility.decode(realName, true);

分析漏洞点在于,

com.sun.org.apache.bcel.internal.util.ClassLoader中的loadclass
if(class_name.indexOf("$$BCEL$$") >= 0)clazz = createClass(class_name);   进行取出前面BCEL标志的操作,

然后createClass中有解码的操作,并且

defineClass(class_name, bytes, 0, bytes.length);中的bytes可控,就是通过调用loadclass中的第一个参数就可以获得。

Java IO/NIO多种读写文件方式

使用Inputstream读取

package com.cxk.input;import java.io.*;public class FileInputStreamDemo {public static void main(String[] args) throws IOException {File file = new File("E:\\123.txt");FileInputStream fis = new FileInputStream(file);int a=0;  byte[] bytes = new byte[1024];// 创建二进制输出流对象ByteArrayOutputStream out = new ByteArrayOutputStream();// 循环读取文件内容while ((a = fis.read(bytes)) != -1) {// 截取缓冲区数组中的内容,(bytes, 0, a)其中的0表示从bytes数组的// 下标0开始截取,a表示输入流read到的字节数。out.write(bytes, 0, a);}System.out.println(out.toString());}}

 很容易理解,这里的out.write其实就是往缓冲区中输入内容,最后out.toString输出出来。

使用OutputStream写入

package com.cxk.input;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FIleoutput {public static void main(String[] args) throws IOException {File file = new File("E://123.txt");FileOutputStream strea = new FileOutputStream(file);String content="who am i jia you xiao zi发给对方 ";strea.write(content.getBytes());strea.flush();strea.close();}
}

RandomAccessFile

是一个既可以读取也可以写入文件的类,

  // 创建RandomAccessFile对象,r表示以只读模式打开文件,一共有:r(只读)、rw(读写)、// rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。RandomAccessFile raf = new RandomAccessFile(file, "r");

相关内容

热门资讯

西安必玩景点全攻略,西安旅游必... 西安必玩景点全攻略!90%人漏掉的绝佳玩法大公开 十三朝古都西安,既有看不完的历史遗迹,也有吃不腻...
上海旅游节开幕在即,南京东路站... 本周六,上海旅游节即将盛大启幕,外滩花车巡游作为活动的一大亮点,预计将吸引众多市民游客纷至沓来。毗邻...
南航执飞4班东盟直航包机 全力... 第22届中国—东盟博览会于9月17日至22日在广西南宁举办。中国南方航空股份有限公司广西分公司(以下...
去一次重庆五天价格多少钱,国庆... 重庆,这座充满魔幻色彩的山城,以其独特的地理风貌、丰富的历史文化和令人垂涎的美食而闻名遐迩。早就听闻...
“三国赤壁 英雄咸宁”再添彩 ... 春赏花、夏避暑、秋品桂、冬沐泉……2025武汉中国文化旅游产业博览会上,咸宁展馆以“四季旅游”为脉络...
西藏桑日县举办旅游推介会 探讨... 中新网拉萨9月14日电 (李林)14日,西藏山南市桑日县在拉萨举办旅游推介会。活动集资源推介、特色展...
重庆报团4天3晚攻略,国庆去重... 第一次来重庆的人,一定要有一个向导,否则来回跑来跑去,会浪费不少钱。 在出发前往重庆前,我们已经接触...
横琴升级亮相广东旅博会 “一签... 9月12日至14日,2025年广东国际旅游产业博览会(CITIE 2025)在中国进出口商品交易会展...
特色浓、立体化、多功能……各地... 来源:央视网央视网消息:近期雨水充沛,位于山东济南章丘区的百脉泉迎来了丰水期,泉水群中的墨泉汹涌喷发...
酒业融合创新发展大会在贵阳举办 9月11日,第十四届中国(贵州)国际酒类博览会酒业融合创新发展大会在贵阳举办。300多位专家学者、酒...
首款低酒度畅饮型老酒“舍得自在... 文丨青兮 舍尽尘中事, 得观天外峰。 自随云卷舒, 在宇任西东。 上线即火爆!《酒眼观酒》从京东平台...
20分钟解锁啃爪快乐!我妈的香... "妈!再给我盛碗饭!"每当这道香辣蒜泥鸡爪上桌,我家饭桌总要上演抢爪大战。鸡爪在红油里裹着蒜香,轻轻...
泡酒选哪种酒泡效果最佳?揭秘泡... 泡酒,作为一种深受中老年人喜爱的养生方式,已经成为了保健文化的一部分。人参泡酒是其中的经典选择之一,...
古家百年酒业有浓香型吗 这是(li460220)整理的信息,希望能帮助到大家 古家百年酒业有浓香型吗 谈到中国的传统酒类,浓...
在这场大会,茅台以“初心”回答... 激活酒文化的时代生命力,看茅台的“初心”实践 文 | 李霞 从仰韶陶甗的残香到商周青铜酒器的礼序,从...
枸杞泡酒的正确泡法,做法超简单... 枸杞泡酒,作为一种传统的家常泡酒方法,备受人们喜爱。其不仅能带来特殊的风味,而且在泡制过程中,还能够...
贵阳酒博会收官日:热闹非凡,酒... 贵阳网·甲秀新闻讯 9月13日,贵阳酒博会迎来最后一天,现场人气爆棚,热闹非凡。市民们穿梭于各个展位...
明天!走进芦台春,探寻“北方第... 北派酱香的价值正被更多人看见。 文|好酒地理局 从地理风土的角度来说,天津算得上是酿酒福地。 九河下...
大量上市!孝感人都爱吃 “秋风白露至,红菱香又甜。”9月7日,负责直播带货的朱湖文联委员正忙碌不停,向大家推荐:“朱湖红菱角...