|
1 | 1 | use alloc::vec; |
2 | 2 |
|
3 | 3 | use java_class_proto::{JavaFieldProto, JavaMethodProto}; |
| 4 | +use java_constants::MethodAccessFlags; |
4 | 5 | use jvm::{ |
5 | 6 | ClassInstanceRef, Jvm, Result, |
6 | 7 | runtime::{JavaLangClass, JavaLangClassLoader, JavaLangString}, |
@@ -33,6 +34,12 @@ impl Class { |
33 | 34 | Self::get_resource_as_stream, |
34 | 35 | Default::default(), |
35 | 36 | ), |
| 37 | + JavaMethodProto::new( |
| 38 | + "forName", |
| 39 | + "(Ljava/lang/String;)Ljava/lang/Class;", |
| 40 | + Self::for_name, |
| 41 | + MethodAccessFlags::STATIC, |
| 42 | + ), |
36 | 43 | ], |
37 | 44 | fields: vec![ |
38 | 45 | JavaFieldProto::new("raw", "[B", Default::default()), // raw rust pointer of Box<dyn Class> |
@@ -87,4 +94,14 @@ impl Class { |
87 | 94 | jvm.invoke_virtual(&class_loader, "getResourceAsStream", "(Ljava/lang/String;)Ljava/io/InputStream;", (name,)) |
88 | 95 | .await |
89 | 96 | } |
| 97 | + |
| 98 | + async fn for_name(jvm: &Jvm, _context: &mut RuntimeContext, name: ClassInstanceRef<String>) -> Result<ClassInstanceRef<Class>> { |
| 99 | + tracing::debug!("java.lang.Class::forName({:?})", &name); |
| 100 | + |
| 101 | + let rust_name = JavaLangString::to_rust_string(jvm, &name).await?; |
| 102 | + let qualified_name = rust_name.replace('.', "/"); |
| 103 | + let class = jvm.get_class(&qualified_name).unwrap().java_class(); |
| 104 | + |
| 105 | + Ok(class.into()) |
| 106 | + } |
90 | 107 | } |
0 commit comments