2010-12-02 54 views
5

S'il est possible d'écrire du code octet pour une méthode censée déclencher une exception vérifiée?Comment le code octet généré par scala supprime-t-il l'exception vérifiée?

Par exemple, la classe Java suivante ne compile pas moins que la méthode déclare lève l'exception vérifié:

public class CheckedExceptionJava { 
    public Class<?> testChecked(String s) throws ClassNotFoundException { 
    return Class.forName(s); 
    } 
} 

Alors que l'équivalent Scala qui suit fait (parce que Scala ne dispose pas d'exceptions vérifiées):

class CheckedException { 
    def testChecked(s : String) = Class.forName(s) 
} 

Même si le bytecode généré sont presque identiques:

Compiled from "CheckedExceptionJava.java" 
public class CheckedExceptionJava extends java.lang.Object{ 
public CheckedExceptionJava(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String) throws java.lang.ClassNotFoundException; 
    Code: 
    0: aload_1 
    1: invokestatic #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

Compiled from "CheckedException.scala" 
public class CheckedException extends java.lang.Object implements scala.ScalaObject{ 
public CheckedException(); 
    Code: 
    0: aload_0 
    1: invokespecial #24; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String); 
    Code: 
    0: aload_1 
    1: invokestatic #11; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

Question: Est-il possible (et comment) de générer un bytecode car celui-ci ne marque pas qu'il lève une exception vérifiée même si le code à l'intérieur de cette méthode ne le gère pas?

Répondre

13

Simple. Alors que le bytecode JVM inclut des spécifications d'exception vérifiées sur les méthodes, le vérificateur de bytecode qui s'exécute avant que tout bytecode ne soit exécuté spécifiquement ne vérifie pas que les méthodes sont réellement conformes aux spécifications d'exception. Vous pouvez écrire un programme qui prend le bytecode JVM existant et supprime toutes les spécifications d'exception, et le bytecode résultant sera parfaitement valide et fonctionnera de la même manière que l'original (sauf réflexion).

+0

Ohhh je vois. Probablement avec un outil comme javassiste? :) http://bit.ly/gNzXfA – OscarRyz