2016-03-26 22 views
0

çalışma zamanı-derleme yaparkenHatalı Java paket sınıf adı yükleme aşağıdaki gibi bir Java çalışma zamanı derleyicisi olan kaynağını

public class SimpleClassLoader extends ClassLoader { 

    private String classname; 
    private byte[] byteCode; 

    public SimpleClassLoader(String classname, byte[] byteCode) { 
     super(SimpleClassLoader.class.getClassLoader()); 
     this.classname = classname; 
     this.byteCode = byteCode; 
    } 

    @Override 
    protected Class<?> findClass(String name) throws ClassNotFoundException { 
     if(name.equals(classname)){ 
      return defineClass(name, byteCode, 0, byteCode.length); 
     } 
     return super.findClass(name); 
    } 
} 

derleme ve bir sınıf yükleme Sonuçta ortaya çıkan sınıfın paket adı, şu sınıf adıyla birleştirilir:

Compiler compiler = new Compiler(); 
    String className = "example.test.TestClass"; 
    String source = "package example.test; public class TestClass{}"; 

    compiler.add(className, source); 
    compiler.compile(); 

    byte[] byteCode = compiler.getByteCode(className); 

    Class<?> aClass = Class.forName(className, true, new SimpleClassLoader(className, byteCode)); 
    System.out.println("Package: " + aClass.getPackage()); // Should be "example.text" 
    System.out.println("Name: " + aClass.getSimpleName()); // Should be "TestClass" 

Outpu Bunun beklenmedik bir şekilde aşağıdaki gibidir:

Package: null 
Name: TestClass 

Burada nereye yanlış gidiyorum?

cevap

0

example.test paket tanımsız ve derleme yöntemi içinde definePackage() arayarak initalized gereken edilmiştir:

public void compile() { 
    List<Source> list = new ArrayList<Source>(); 
    for (Map.Entry<PackageClass, String> entry : source.entrySet()) { 
     list.add(new Source(entry.getKey().getCanonicalName(), JavaFileObject.Kind.SOURCE, entry.getValue())); 
     if(getPackage(entry.getKey().getPackage()) == null) { 
      definePackage(entry.getKey().getPackage(), null, null, null, null, null, null, null); 
     } 
    } 
    this.compiler.getTask(null, this.manager, null, null, null, list).call(); 
} 
0

aClass.getName() sonucu doğru. Programın "TestClass" değerini döndürmesini istiyorsanız, aClass.getSimpleName()'u kullanmalısınız.

java.lang.Class.getPackage()'un kaynak kodunu kontrol ediyorum. Sizin durumunuza class.getClassLoader().getPackage("example.test")'u çağıran Package.getPackage(this)'u çağırır. SimpleClassLoader, protected Class findClass(String name) geçersiz kılma yöntemine sahip olduğundan, protected Package getPackage(String name) yöntemini geçersiz kılmalı ve beklediğiniz nesneyi döndürmelisiniz.

+1

Ah) (aynı zamanda definePackage ile sınıfını tanımlayan paket tanımlamak gerekir benzeyen –

İlgili konular