
Descompilador de Java y operador de serialización en Go puro
.zip.class (pool de
constantes, campos, métodos, versión, flags de acceso).Diseñado para portabilidad e integración:
javajive envuelve las tres
capacidades; los subpaquetes siguen disponibles para uso avanzado.decompile, classinfo y serial,
construidos sobre la biblioteca estándar..class / .jar reales y
blobs serializados por el JDK con javac/java, y luego verifica JavaJive contra ellos
(ver HARNESS-WORKFLOW.md).utils / codec / log / go-funk están
reimplementados como un núcleo internal/ mínimo y autocontenido.La auditoría diferencial completa de 38 JAR registra cero regresiones contra la línea base fija: los 20 JAR previamente compilables sin errores se conservan y 26 ahora compilan en su totalidad. Los defectos de la línea base y 4 stubs de métodos existentes permanecen visibles. Ver los resultados por JAR y reproducción.
250 round trips semánticos aislados registran compilación, verificación de la JVM, stubs e igualdad en tiempo de ejecución por separado; las clases de la aplicación original están ausentes de los classpaths reconstruidos. CI ejecuta la auditoría semántica en JDK 17 y 21, la comparación histórica completa, y las matrices de OS/Go y de race. Estas comprobaciones no demuestran la equivalencia de todos los métodos de las bibliotecas. Ver la implementación y límites restantes.
Las siguientes cifras se reportaron para v0.3.0 el 2026-09-05. No son resultados de aceptación de la versión actual ni prueba de equivalencia de comportamiento.
Medido en 34 jars del mundo real (18,759 unidades aplanadas) mediante decompile → recompilación con javac --release 8
→ reempaquetado → verificación de la JVM:
Outer$Inner.java)
recompilan con cero errores de javac, y 0 errores de sintaxis en los 34 jars (una aserción
estricta aplicada por CI, de modo que ningún error de tipo puede ocultarse tras un fallo del lexer).-Xverify:all de la JVM pasa de extremo a extremo (el codec es idéntico byte a byte al
jar original bajo un diferencial de llamadas). Fijado en provenClean.Ver BENCHMARK.md para la metodología completa, tablas por jar y comandos de reproducción.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
O compilar desde el código fuente:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
Requiere Go 1.22+.
javajive <command> [arguments]
Commands:
decompile decompile .class/.jar/.war/.zip or a directory into Java source
classinfo print the structure of a .class file (version, fields, methods)
serial Java serialization tools (subcommands: tojson, fromjson)
version print the version
help show help
# Single class: prints to stdout by default, or -o to write a file.
javajive decompile Foo.class
javajive decompile Foo.class -o Foo.java
# Archive: defaults to a "<input>.src" directory, or -o to choose one.
javajive decompile app.jar
javajive decompile app.war -o ./app-src
# Directory: recursively decompile .class files (requires -o output dir).
javajive decompile ./classes -o ./src
javajive classinfo Foo.class
class: InvisibleAnnoSeed
super: java/lang/Object
version: 61.0
access: public
constants: 18
fields (0):
methods (2):
<init>()V
run()I
# Serialized binary -> JSON. (-hex: input is a hex string, -: read from stdin)
javajive serial tojson dump.bin
printf 'aced000574000568656c6c6f' | javajive serial tojson -hex -
# JSON -> serialized binary. (default prints hex; with -o writes raw bytes)
javajive serial fromjson dump.json -o out.bin
javajive serial fromjson dump.json # prints hex
Usa el paquete fachada unificado — una sola importación cubre las tres capacidades:
import "github.com/yaklang/javajive"
// Decompile a single class, or a whole archive into a directory.
src, err := javajive.Decompile(classBytes)
err = javajive.DecompileArchive("app.jar", "app-src")
// Inspect class structure.
obj, err := javajive.ParseClass(classBytes)
_ = obj.GetClassName()
// Java serialization: binary -> JSON -> binary.
objs, _ := javajive.ParseSerialized(raw) // or ParseSerializedHex(hexStr)
jsonBytes, _ := javajive.SerializedToJSON(objs...)
restored, _ := javajive.SerializedFromJSON(jsonBytes)
out := javajive.MarshalSerialized(restored...)
| Función | Propósito |
|---|---|
Decompile(classBytes) (string, error) | Descompila los bytes de un .class |
DecompileFile(path) (string, error) | Descompila un .class desde disco |
DecompileWithResolver(classBytes, resolve) | Descompila con un resolvedor de bytes de clase |
DecompileArchive(src, dst) error | Descompila un .jar/.war/.zip en un directorio |
ParseClass(classBytes) (*ClassObject, error) | Analiza los bytes de un .class |
ParseClassFile(path) (*ClassObject, error) | Analiza un .class desde disco |
ParseSerialized(raw) ([]JavaSerializable, error) | Analiza un flujo de serialización |
ParseSerializedHex(hexStr) ([]JavaSerializable, error) | Analiza un flujo codificado en hex |
MarshalSerialized(objs...) []byte | Vuelve a codificar objetos al formato de cable |
MarshalSerializedHex(objs...) string | Vuelve a codificar a hex |
SerializedToJSON(objs...) ([]byte, error) | Convierte objetos a JSON |
SerializedFromJSON(raw) ([]JavaSerializable, error) | Reconstruye objetos desde JSON |
Los subpaquetes también se exportan para uso avanzado:
classparser, classparser/jarwar, serialization.
Para mantenerse portátil y pequeño, JavaJive hace algunas concesiones deliberadas frente a yaklang. Ver MIGRATE.md para el mapeo completo y la guía de migración.
| Área | yaklang (original) | JavaJive |
|---|---|---|
| Red de seguridad ANTLR del decompilador | revalida el código fuente volcado mediante una gramática Java de ANTLR; degrada miembros a stubs en caso de fallo | eliminada (dependencia pesada); la validación es un no-op, la salida se emite directamente |
Capa de soporte (utils / codec / log / go-funk) | paquetes compartidos del monorepo | reimplementaciones mínimas y autocontenidas bajo internal/ |
Generador de gadgets yso | incluido | no incluido |
Recuperación de charset de literales de cadena (MatchMIMEType) | recuperación opcional de GBK/GB18030 | stub (no-op); comportamiento sin cambios para la gran mayoría de los casos |
Las dependencias de terceros se limitan a un pequeño conjunto de bibliotecas puras en Go
(gobwas/glob, go-viper/mapstructure, samber/lo, tidwall/gjson,
segmentio/ksuid, yeka/zip, y algunas golang.org/x/*).
go test ./... # unit tests + JDK cross-tests (skipped if no JDK)
go test ./... -race # data-race free (linux)
go test ./test/cross/ -v # Java cross-tests only (needs javac/java on PATH)
Las pruebas cruzadas con JDK compilan artefactos Java reales en tiempo de prueba y los verifican
contra JavaJive; hacen t.Skip automáticamente cuando no hay un JDK presente. Ver
HARNESS-WORKFLOW.md para saber cómo funcionan el harness y CI.
javajive.go unified facade package (import "github.com/yaklang/javajive")
serialization/ Java serialization/deserialization (from yaklang common/yserx)
classparser/ class parser + decompiler (from yaklang common/javaclassparser)
cmd/javajive/ CLI entry point
internal/ trimmed self-contained support layer (log / codec / funk / utils / filesys / ...)
test/cross/ JDK-backed cross-tests (javac/java)
site/ static landing page deployed to GitHub Pages