jvmti_rs/wrapper/jvmtifns/
class.rs

1use jni::sys::jobject;
2use jni::sys::jclass;
3use crate::{builder::*, errors::*, JVMTIEnv, objects::*, sys::*};
4
5impl<'a> JVMTIEnv<'a> {
6    pub fn get_loaded_classes(&self) -> Result<Vec<JClass>> {
7        let mut builder: MutAutoDeallocateObjectArrayBuilder<jclass> = MutAutoDeallocateObjectArrayBuilder::new();
8        let res = jvmti_call_result!( self.jvmti_raw(), GetLoadedClasses,
9            &mut builder.count,
10            &mut builder.items
11        );
12        jvmti_error_code_to_result(res)?;
13        Ok(builder.build(self))
14    }
15
16    pub fn get_class_loader_classes(&self, initiating_loader: &JObject) -> Result<Vec<JClass>> {
17        let mut builder: MutAutoDeallocateObjectArrayBuilder<jclass> = MutAutoDeallocateObjectArrayBuilder::new();
18        let res = jvmti_call_result!( self.jvmti_raw(), GetClassLoaderClasses,
19            initiating_loader.into_inner(),
20            &mut builder.count,
21            &mut builder.items
22        );
23        jvmti_error_code_to_result(res)?;
24        Ok(builder.build(self))
25    }
26
27    pub fn retransform_classes(&self, classes: &Vec<JClass>) -> Result<()> {
28        if classes.is_empty() {
29            return Ok(());
30        }
31        let items: Vec<jobject> = classes.iter().map(|&e| e.into_inner()).collect();
32        jvmti_call!( self.jvmti_raw(), RetransformClasses,
33            items.len() as jint,
34            items.as_ptr()
35        )
36    }
37
38    pub fn redefine_classes(&self, classes: &Vec<JClassDefinition>) -> Result<()> {
39        if classes.is_empty() {
40            return Ok(());
41        }
42        let definitions: Vec<jvmtiClassDefinition> = classes.iter().map(|e| (e).into()).collect();
43        jvmti_call!(self.jvmti_raw(), RedefineClasses,
44            definitions.len() as jint,
45            definitions.as_ptr()
46        )
47    }
48}