jvmti_rs/wrapper/jvmtifns/
class.rs1use 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}