2014-12-31 15 views
5

beklenen CallerSensitive açıklama ı çağıran sınıfının adını elde etmeye çalışmak:java.lang.InternalError: (<code>@CallerSensitive</code> ile Açıklamalı) statik bir yöntemde çerçeve 1

: hatası alıyorum

@CallerSensitive 
public static void someMethod() { 
    String name = sun.reflect.Reflection.getCallerClass().getName(); 
    ... 
} 

java.lang.InternalError: CallerSensitive annotation expected at frame 1 

Burada sorun nedir?

Kaynaklar

UPDATE Java 8 (U25) ve yöntem getCallerClass() kullanıyorum

kaldırıldı değildir olan (getCallerClass(int)

Classfile jar:file:/usr/lib/jvm/jdk1.8.0_25/jre/lib/rt.jar!/sun/reflect/Reflection.class 
Last modified Sep 17, 2014; size 6476 bytes 
Compiled from "Reflection.java" 
public class sun.reflect.Reflection 
minor version: 0 
major version: 52 
flags: ACC_PUBLIC, ACC_SUPER 
Constant pool: 
#78 = Utf8    Lsun/reflect/CallerSensitive; 
#80 = Utf8    Deprecated 
#82 = Utf8    Ljava/lang/Deprecated; 
{ 
public sun.reflect.Reflection(); 
descriptor:()V 
flags: ACC_PUBLIC 

public static native java.lang.Class<?> getCallerClass(); 
descriptor:()Ljava/lang/Class; 
flags: ACC_PUBLIC, ACC_STATIC, ACC_NATIVE 
Signature: #76       //()Ljava/lang/Class<*>; 
RuntimeVisibleAnnotations: 
    0: #78() 

public static native java.lang.Class<?> getCallerClass(int); 
descriptor: (I)Ljava/lang/Class; 
flags: ACC_PUBLIC, ACC_STATIC, ACC_NATIVE 
Deprecated: true 
Signature: #81       // (I)Ljava/lang/Class<*>; 
RuntimeVisibleAnnotations: 
    0: #82() 
+0

Ne java sürümünden

alıntı kullanıyorsunuz? Bağlandığınız belgelere göre, getCallerClass() kullanımdan kaldırıldı ve kaldırıldı. –

+0

Teşekkürler! Güncelleştirilmiş soruma bakın – rmuller

cevap

8

Bu açıklamayı yalnızca ayrıcalıklı kod kullanabilir. kod, bootstrap sınıfı yükleyici veya uzantı sınıfı yükleyici ile yüklenirse ayrıcalıklıdır. Açık JDK kaynak dosyası classFileParser.cpp

// Privileged code can use all annotations. Other code silently drops some. 
    const bool privileged = loader_data->is_the_null_class_loader_data() || 
          loader_data->is_ext_class_loader_data() || 
          loader_data->is_anonymous(); 
0

getCallerClass() Java8 kaldırılır)

$ /usr/lib/jvm/java-8-oracle/bin/javap -cp /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar -verbose sun.reflect.Reflection > bytecode 

Çıkış (sadece ilgili hatlar gösterilmiştir: bayt kodu sökülmesi da görülebildiği gibi) kullanımdan kaldırılmıştır. Bu örneği Java 8'de çalıştırdığımda, aynı hatayı alıyorum. Java 7 ile Çalışmak (1.7.0_55) Çağrı sınıfının adını alıyorum. Her neyse, doğrudan güneşten bir şey kullanmaktan kaçınıyorum. * Paket hiyerarşisi.

public static void someMethod() { 
    new SecurityManager() { 
     { 
      String name = getClassContext()[1].getSimpleName(); 
      System.err.println(name == null ? "null" : name); 
     } 
    }; 
} 
:

aşağıdakileri yapabilirsiniz çağıran sınıfının adını almak için (Sadece SecurityManager kaynaklanıyor ve sınıfta bir getCallerClass() yöntemini vermelidir, adını almak için örnek başlatıcı kullanılır)
+1

Hayır, bu yöntemler * Java * 8 kaldırılmaz *, ayrıntılar için güncellenmiş soruma bakın. BTW senin ucun harika, bu olasılığı bilmiyordum. Ancak, bir çözüm istemiyorum ama bir açıklama :) – rmuller

İlgili konular