2010-06-30 6 views
44

Je cherche à écrire un programme court (peut-être un Hello World) en Java bytecode. Je veux juste écrire le bytecode en utilisant mon éditeur de texte et l'exécuter. Comment ferais-je cela? Vous avez un exemple? Merci!Programmation en Java bytecode

+0

Lisez https://docs.oracle.com/javase/specs/jvms/se7/html/index.html et utilisez 'printf' dans bash :-) –

Répondre

42

Vous pouvez essayer Jasmin!

.class public HelloWorld 
.super java/lang/Object 

.method public static main([Ljava/lang/String;)V 
    .limit stack 3 
    .limit locals 1 

    getstatic  java/lang/System/out Ljava/io/PrintStream; 
    ldc   "Hello World." 
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 

    return 

.end method 

Vous compilez à l'aide:

 
> java -jar jasmin.jar hello.j 

Et puis vous exécutez comme une classe:

 
> java HelloWorld 
Hello World. 

Mise à jour

Je vois que votre question mentionne « sans en utilisant Javac ou Java ". Pourriez-vous préciser comment vous entendez cette déclaration?

+6

Ce post me donne envie de faire semblant le travail que je fais aujourd'hui et de bricoler avec Jasmin. :-) – corsiKa

+0

+1 Jasmin est ce qui m'est venu à l'esprit et je ne pouvais pas me souvenir du nom. Il a été présenté dans un livre qui explique les internes de la JVM. J'ai oublié le nom du livre aussi, * soupir * ... – bakkal

+0

@Bakkal: Selon le lien: "Jasmin a été créé à l'origine comme un compagnon du livre" Java Virtual Machine ", écrit par Jon Meyer et Troy Downing et publié par O'Reilly Associates. " –

8

Avez-vous considéré JBE (Java Bytecode Editor)?
Il est basé sur bytecode Engineering Library d'Apache (BCEL)

+0

typo: c'est BCEL. Sinon super éditeur –

7

Peut-être que cet article peut vous aider à démarrer: Bytecode basics (un peu vieux, mais vous voyez l'idée).

Le class file format sera utile aussi: D

+0

+1 pour l'édition – Pops

7

Le code d'octet est écrit en tant qu'octets réels, qui ne sont normalement pas facilement modifiables par un éditeur de texte normal.

Cela signifie que vous aurez besoin de quelque chose qui convertit une représentation textuelle en binaire. Un lieu raisonnable pour commencer serait un assembleur comme Jasmin.

8

J'ai créé un nouveau Java bytecode assembler qui est rétrocompatible avec Jasmin mais qui ajoute aussi beaucoup de nouvelles fonctionnalités et simplifie légèrement la syntaxe.

Voici un exemple de la façon dont vous pourriez écrire un programme Hello World.

.class public hello 
.super java/lang/Object 

.method public static main : ([Ljava/lang/String;)V 
    .limit stack 10 
    .limit locals 10 

    getstatic java/lang/System out Ljava/io/PrintStream; 
    ldc "Hello World!" 
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V 
    return 
.end method 

. Il couvre actuellement seulement Hello, World, mais je peux continuer s'il y a un intérêt.

+1

le lien est cassé – Manza

+0

Désolé à ce sujet. Il semble que tout le wiki est parti. Je vais les envoyer par courriel pour voir s'ils peuvent le ramener ou en avoir des copies. – Antimony