scala覆盖静态java方法

时间:2014-12-21 16:22:33

标签: java scala reflection

我正在尝试在Scala中使用Webgraph http://webgraph.di.unimi.it/框架。这里存在一些自定义Loader类的可能性。这种定制是通过反思完成的。

...
graphClass = Class.forName( graphClassName ); // graphClassName string name of class 
graph = (ImmutableGraph)graphClass.getMethod( "load", classOf[CharSequence] ).invoke( null, is );
...

在java中“load”是类的静态方法,但是如何在scala上编写这个方法以允许我的代码工作? 我试过了

class MyLoader {
   def load(filename:CharSequence ) =  ...
}

甚至

object MyLoader {
   def load(filename:CharSequence ) =  ...
}

with graphClassName =“MyLoader $”

但没有成功。

已知和工作的解决方案是编写桥接Java类,但如果存在一些“合法”的方法,这很有意思。

//     MyLoader.java

public class MyLoader {

    public static ImmutableGraph load( CharSequence basename ) throws IOException {
        return new ScalaMyLoader(basename);
    }

}

1 个答案:

答案 0 :(得分:1)

定义一个对象,但反思“MyLoader.class”。

你会在那里看到一个静态转发器方法。

有关

object Foo { def foo = 42 }

然后

$javap -pv Foo   // not Foo$
{
  public static int foo();
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: getstatic     #16                 // Field stat/Foo$.MODULE$:Lstat/Foo$;
         3: invokevirtual #18                 // Method stat/Foo$.foo:()I
         6: ireturn       
}