alibaba / alibaba/one-java-agent
如何识别transform 传过来的字节码,是否实现了某一接口,或者是否子类
- Lingua principale
- Java
- Stelle
- 579
- Fork
- 128
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
对于ClassFileTransformer的回调函数,`String className, Class classBeingRedefined` 都有可能是空的。因为类在第一次加载时,还没有被加载到JVM里。只能取到 `byte[] classfileBuffer`。
```java
@Override
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
```
但是只从`byte[] classfileBuffer`是没有办法判断它所有实现的接口和继承的父类的。 比如有多重继承时。
只能取到这个类本身显式 `implements`和`extends`的信息。
---
为了解决这个问题,有两种思路:
1. 尝试用ClassLoader去 getResource,把每一个父类,父接口的`.class`读取出来,再一层层向上解析。但这个有可能不能工作。因为有些类并不一定会有 `.class`,并且ClassLoader也并不一定能读到对应的resource。
2. 对于每一个传入的`Class classBeingRedefined` 为 null 的类,都解析`byte[] classfileBuffer`,读取并记录它的信息。因为父类是要先于子类加载的,所以能保证在子类想要解析时,总能读出前面已保存过的父类的信息。 缺点是会占比较多内存,还有多ClassLoader情况,是否能正确工作?
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
Start with the ClassFileTransformer.transform callback and the classfileBuffer, classBeingRedefined, and className cases described here. Compare the two proposed class-resolution approaches across parent classes, interfaces, unavailable resources, and multiple class loaders. The issue is ready only when a concrete implementation scope and verification criteria are agreed.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java
- Ambito
- devtools
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100