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