template <ArtJvmtiEvent kEvent> void Transformer::CallClassFileLoadHooksSingleClass(EventHandler* event_handler,
art::Thread* self, /*in-out*/ ArtClassDefinition* def) {
static_assert(kEvent == ArtJvmtiEvent::kClassFileLoadHookNonRetransformable ||
kEvent == ArtJvmtiEvent::kClassFileLoadHookRetransformable ||
kEvent == ArtJvmtiEvent::kStructuralDexFileLoadHook, "bad event type"); // We don't want to do transitions between calling the event and setting the new data so change to // native state early.
art::ScopedThreadStateChange stsc(self, art::ThreadState::kNative);
jint new_len = -1; unsignedchar* new_data = nullptr;
art::ArrayRef<constunsignedchar> dex_data = def->GetDexData();
event_handler->DispatchEvent<kEvent>(
self, static_cast<JNIEnv*>(self->GetJniEnv()),
def->GetClass(),
def->GetLoader(),
def->GetName().c_str(),
def->GetProtectionDomain(), static_cast<jint>(dex_data.size()),
dex_data.data(), /*out*/&new_len, /*out*/&new_data);
def->SetNewDexData(new_len, new_data, kEvent);
}
template <RedefinitionType kType> void Transformer::CallClassFileLoadHooks(art::Thread* self, /*in-out*/ std::vector<ArtClassDefinition>* definitions) { if (kType == RedefinitionType::kNormal) { // For normal redefinition we have to call ClassFileLoadHook according to the spec. We use an // internal event "ClassFileLoadHookRetransformable" for agents that can redefine and a // "ClassFileLoadHookNonRetransformable" for agents that cannot redefine. When an agent is // attached to a non-debuggable environment, we cannot redefine any classes. Splitting the // ClassFileLoadHooks allows us to differentiate between these two cases. This method is only // called when redefinition is allowed so just run ClassFileLoadHookRetransformable hooks. for (ArtClassDefinition& def : *definitions) {
CallClassFileLoadHooksSingleClass<ArtJvmtiEvent::kClassFileLoadHookRetransformable>(
gEventHandler, self, &def);
}
} else { // For structural redefinition we call StructualDexFileLoadHook in addition to the // ClassFileLoadHooks. This let's us specify if structural modifications are allowed. // TODO(mythria): The spec only specifies we need to call ClassFileLoadHooks, the // StructuralDexFileLoadHooks is internal to ART. It is not clear if we need to run all // StructuralDexFileHooks before ClassFileLoadHooks. Doing it this way to keep the existing // behaviour. for (ArtClassDefinition& def : *definitions) {
CallClassFileLoadHooksSingleClass<ArtJvmtiEvent::kStructuralDexFileLoadHook>(
gEventHandler, self, &def);
} for (ArtClassDefinition& def : *definitions) {
CallClassFileLoadHooksSingleClass<ArtJvmtiEvent::kClassFileLoadHookRetransformable>(
gEventHandler, self, &def);
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.