2016-10-27 12 views
0

は、我々は次のことを持って考えてみましょう:私はリフレクションを使用してオーバーライドされたメソッドを呼び出す方法は?

java.lang.IllegalAccessException: no private access for invokespecial: class Successor, from TestApp$ 

:私は(How to call a superclass method using Java reflectionから取った)次の操作を実行しようとしてい

class Base { def name = "Base" } 
class Successor extends Base { 
    override def name = "Successor" 
} 

import java.lang.invoke.{MethodHandles, MethodHandle, MethodType} 

object TestApp { 
    def main(args: Array[String]) { 
     val a = new Successor; 
     val h1 = MethodHandles.lookup().findSpecial(classOf[Base], 
                "name", 
                MethodType.methodType(classOf[String]), 
                classOf[Successor]); 
     println(h1.invoke(a)); 
    } 
} 

が、私は、実行時例外を取得JavaのリフレクションがScalaで正しく機能しない可能性があると言われました。本当ですか?または私は単に何か間違っている?

答えて

0

ScalaでもJavaリフレクションが動作するように見えますが、私はHow to call a superclass method using Java reflectionのすべての答えを読んでいません。

次のコードは動作します。このソリューションのJesse Glick

object TestApp { 
    def main(args: Array[String]) { 
     val a = new Successor; 
     val impl_lookup = classOf[MethodHandles.Lookup].getDeclaredField("IMPL_LOOKUP") 
     impl_lookup.setAccessible(true) 
     val lkp = impl_lookup.get(null).asInstanceOf[MethodHandles.Lookup]; 
     val h1 = lkp.findSpecial(classOf[Base], 
           "name", 
           MethodType.methodType(classOf[String]), 
           classOf[Successor]) 
     println(h1.invoke(a)) // prints "Base" 
     println(a.name)  // prints "Successor" 
    } 
} 

感謝を。

1

実際、Javaで実行することはできません。 「Javaリフレクションを使用してスーパークラスメソッドを呼び出す方法」の回答では、テストがBase:public class Test extends Base {...}を拡張しているために機能します。

関連する問題