jvmti_rs/wrapper/jvmtifns/
class_jni.rs

1use std::ptr;
2
3use jni::strings::JNIString;
4use jni::sys::jobject;
5use jni::sys::jclass;
6use crate::{builder::*, Desc, errors::*, JSignature, JvmtiClassStatus, JVMTIEnv, objects::*, sys::*, to_bool, Transform};
7
8impl<'a> JVMTIEnv<'a> {
9    pub fn get_class<S>(&self, jni: &jni::JNIEnv<'a>, name: S) -> Result<JClass>
10        where
11            S: Into<JNIString>, {
12        let ffi_name = name.into();
13        ffi_name.lookup(jni)
14    }
15
16    pub fn get_class_signature<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<JSignature>
17        where
18            K: Transform<'a, JClass<'a>> {
19        let klass: JClass = class.transform(jni)?;
20
21        let mut signature = ptr::null_mut();
22        let mut generic = ptr::null_mut();
23        let res = jvmti_call_result!(self.jvmti_raw(), GetClassSignature,
24            klass.into_inner(),
25            &mut signature,
26            &mut generic
27        );
28        jvmti_error_code_to_result(res)?;
29
30        JSignature::new(self.build_string(signature)?, self.build_string(generic)?)
31    }
32
33    pub fn get_class_status<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<JvmtiClassStatus>
34        where
35            K: Transform<'a, JClass<'a>> {
36        let klass: JClass = class.transform(jni)?;
37
38        let res = jvmti_call_number_result!(self.jvmti_raw(), jint,
39            GetClassStatus,
40            klass.into_inner()
41        );
42        Ok((res as jvmtiClassStatus).into())
43    }
44
45    pub fn get_source_file_name<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<String>
46        where
47            K: Transform<'a, JClass<'a>> {
48        let klass: JClass = class.transform(jni)?;
49
50        let mut source_name = ptr::null_mut();
51        let res = jvmti_call_result!(self.jvmti_raw(), GetSourceFileName,
52            klass.into_inner(),
53            &mut source_name
54        );
55        jvmti_error_code_to_result(res)?;
56        Ok(self.build_string(source_name)?.into())
57    }
58
59    pub fn get_class_modifiers<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<jint>
60        where
61            K: Transform<'a, JClass<'a>> {
62        let klass: JClass = class.transform(jni)?;
63
64        Ok(jvmti_call_number_result!(self.jvmti_raw(), jint,
65            GetClassModifiers,
66            klass.into_inner()
67        ))
68    }
69
70    pub fn get_class_methods<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<Vec<JMethodID>>
71        where
72            K: Transform<'a, JClass<'a>> {
73        let klass: JClass = class.transform(jni)?;
74
75        let mut builder: MutAutoDeallocateObjectArrayBuilder<jmethodID> = MutAutoDeallocateObjectArrayBuilder::new();
76        let res = jvmti_call_result!( self.jvmti_raw(), GetClassMethods,
77            klass.into_inner(),
78            &mut builder.count,
79            &mut builder.items
80        );
81        jvmti_error_code_to_result(res)?;
82        Ok(builder.build(self))
83    }
84
85    pub fn get_class_fields<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<Vec<JFieldID>>
86        where
87            K: Transform<'a, JClass<'a>> {
88        let klass: JClass = class.transform(jni)?;
89
90        let mut builder: MutAutoDeallocateObjectArrayBuilder<jfieldID> = MutAutoDeallocateObjectArrayBuilder::new();
91        let res = jvmti_call_result!( self.jvmti_raw(), GetClassFields,
92            klass.into_inner(),
93            &mut builder.count,
94            &mut builder.items
95        );
96        jvmti_error_code_to_result(res)?;
97        Ok(builder.build(self))
98    }
99
100    pub fn get_implemented_interfaces<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<Vec<JClass>>
101        where
102            K: Transform<'a, JClass<'a>> {
103        let klass: JClass = class.transform(jni)?;
104
105        let mut builder: MutAutoDeallocateObjectArrayBuilder<jclass> = MutAutoDeallocateObjectArrayBuilder::new();
106        let res = jvmti_call_result!( self.jvmti_raw(), GetImplementedInterfaces,
107            klass.into_inner(),
108            &mut builder.count,
109            &mut builder.items
110        );
111        jvmti_error_code_to_result(res)?;
112        Ok(builder.build(self))
113    }
114
115    pub fn is_interface<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<bool>
116        where
117            K: Transform<'a, JClass<'a>> {
118        let klass: JClass = class.transform(jni)?;
119
120        let res = jvmti_call_number_result!(self.jvmti_raw(), jboolean,
121            IsInterface,
122            klass.into_inner()
123        );
124        Ok(to_bool(res))
125    }
126
127    pub fn is_array_class<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<bool>
128        where
129            K: Transform<'a, JClass<'a>> {
130        let klass: JClass = class.transform(jni)?;
131
132        let res = jvmti_call_number_result!(self.jvmti_raw(), jboolean,
133            IsArrayClass,
134            klass.into_inner()
135        );
136        Ok(to_bool(res))
137    }
138
139    pub fn is_modifiable_class<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<bool>
140        where
141            K: Transform<'a, JClass<'a>> {
142        let klass: JClass = class.transform(jni)?;
143
144        let res = jvmti_call_number_result!(self.jvmti_raw(), jboolean,
145            IsModifiableClass,
146            klass.into_inner()
147        );
148        Ok(to_bool(res))
149    }
150
151    pub fn get_source_debug_extension<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<String>
152        where
153            K: Transform<'a, JClass<'a>> {
154        let klass: JClass = class.transform(jni)?;
155
156        let mut source_debug_extension = ptr::null_mut();
157        let res = jvmti_call_result!(self.jvmti_raw(), GetSourceDebugExtension,
158            klass.into_inner(),
159            &mut source_debug_extension
160        );
161        jvmti_error_code_to_result(res)?;
162        Ok(self.build_string(source_debug_extension)?.into())
163    }
164
165    pub fn get_class_loader<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<JClassLoader>
166        where
167            K: Transform<'a, JClass<'a>> {
168        let klass: JClass = class.transform(jni)?;
169
170        let mut value: jobject = ptr::null_mut();
171        let res = jvmti_call_result!(self.jvmti_raw(), GetClassLoader,
172            klass.into_inner(),
173            &mut value
174        );
175        jvmti_error_code_to_result(res)?;
176        return Ok(value.into());
177    }
178
179    pub fn get_constant_pool<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<JConstantPool>
180        where
181            K: Transform<'a, JClass<'a>> {
182        let klass: JClass = class.transform(jni)?;
183
184        let mut constant_pool_count: jint = 0 as jint;
185        let mut constant_pool_byte_count: jint = 0 as jint;
186        let mut constant_pool_bytes: jmemory = ptr::null_mut();
187        let res = jvmti_call_result!(self.jvmti_raw(), GetConstantPool,
188            klass.into_inner(),
189            &mut constant_pool_count,
190            &mut constant_pool_byte_count,
191            &mut constant_pool_bytes
192        );
193        jvmti_error_code_to_result(res)?;
194
195        Ok(JConstantPool::new(constant_pool_count, constant_pool_byte_count, constant_pool_bytes, self))
196    }
197
198    pub fn get_class_version_numbers<K>(&self, jni: &jni::JNIEnv<'a>, class: K) -> Result<JClassVersionNumber>
199        where
200            K: Transform<'a, JClass<'a>> {
201        let klass: JClass = class.transform(jni)?;
202
203        let mut minor_version: jint = 0 as jint;
204        let mut major_version: jint = 0 as jint;
205
206        let res = jvmti_call_result!(self.jvmti_raw(), GetClassVersionNumbers,
207            klass.into_inner(),
208            &mut minor_version,
209            &mut major_version
210        );
211        jvmti_error_code_to_result(res)?;
212        Ok(JClassVersionNumber::new(minor_version, major_version))
213    }
214}