2010-12-02 12 views
5

Kontrol edilmiş bir istisna atması gereken bir yöntem için bayt kodu yazılması mümkün mü? (Scala istisnalar kontrol yapılmadığı için) Aşağıdaki Scala eşdeğer yok ikenScala oluşturulmuş bayt kodu, kontrol edilen istisnayı nasıl azaltır?

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

:

yöntemi kontrol istisna atar beyan sürece

Örneğin aşağıdaki Java sınıfı derleme değil

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

üretilen bayt kodu hemen hemen aynı olsa bile:

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 

} 

Soru: Bu yöntemin içindeki kodun işlenmemesine rağmen, kontrol edilen bir istisna attığını işaretlemeyen bir bayt kodu oluşturmak mümkün mü (ve nasıl)?

cevap

13

Basit. JVM bayt kodu, yöntemler üzerinde kontrol edilmiş istisna spesifikasyonları içermekle birlikte, herhangi bir bayt kodu yürütülmeden önce çalışan bytecode veri doğrulayıcısı, özellikle yöntemlerin istisna özelliklerine uyup uymadığını kontrol etmemektedir. Varolan JVM bayt kodunu alan ve tüm özel durum belirtimlerini kaldıran bir program yazabilir ve sonuçta bayt kodu tam olarak geçerli olur ve orijinaliyle aynı şekilde çalışır (engelleme yansıması).

+0

Ohhh Görüyorum. Muhtemelen donanma gibi bir araçla mı? :) http://bit.ly/gNzXfA – OscarRyz

İlgili konular