1- use alloc:: boxed:: Box ;
1+ use alloc:: { boxed:: Box , string :: String , vec :: Vec } ;
22
3- use crate :: { Result , class_definition:: ClassDefinition , class_instance:: ClassInstance , jvm:: Jvm } ;
3+ use bytemuck:: cast_vec;
4+
5+ use crate :: { Array , ClassInstanceRef , Result , class_definition:: ClassDefinition , class_instance:: ClassInstance , jvm:: Jvm } ;
46
57pub struct JavaLangClass ;
68
79impl JavaLangClass {
810 #[ allow( clippy:: borrowed_box) ]
911 pub async fn to_rust_class ( jvm : & Jvm , this : & Box < dyn ClassInstance > ) -> Result < Box < dyn ClassDefinition > > {
10- let rust_class = jvm. get_rust_object_field ( this, "raw" ) . await ?;
11-
12- Ok ( rust_class)
12+ let name_bytes: ClassInstanceRef < Array < i8 > > = jvm. get_field ( this, "nameBytes" , "[B" ) . await ?;
13+ let len = jvm. array_length ( & name_bytes) . await ?;
14+ let name_bytes_vec: Vec < i8 > = jvm. load_array ( & name_bytes, 0 , len) . await ?;
15+ let class_name = String :: from_utf8 ( cast_vec ( name_bytes_vec) ) . unwrap_or_default ( ) ;
16+ if let Some ( class) = jvm. get_class ( & class_name) {
17+ Ok ( class. definition )
18+ } else {
19+ Err ( jvm. exception ( "java/lang/NoClassDefFoundError" , & class_name) . await )
20+ }
1321 }
1422
1523 pub async fn from_rust_class (
@@ -19,7 +27,12 @@ impl JavaLangClass {
1927 ) -> Result < Box < dyn ClassInstance > > {
2028 let mut java_class = jvm. new_class ( "java/lang/Class" , "()V" , ( ) ) . await ?;
2129
22- jvm. put_rust_object_field ( & mut java_class, "raw" , rust_class) . await ?;
30+ let class_name = rust_class. name ( ) ;
31+ let mut name_bytes = jvm. instantiate_array ( "B" , class_name. len ( ) ) . await ?;
32+ let bytes: Vec < i8 > = cast_vec ( class_name. into_bytes ( ) ) ;
33+ jvm. store_array ( & mut name_bytes, 0 , bytes) . await ?;
34+ jvm. put_field ( & mut java_class, "nameBytes" , "[B" , name_bytes) . await ?;
35+
2336 jvm. put_field ( & mut java_class, "classLoader" , "Ljava/lang/ClassLoader;" , class_loader)
2437 . await ?;
2538
0 commit comments