2014-12-21 75 views
1

我想在Scala中使用Webgraph http://webgraph.di.unimi.it/框架。这里有一些定制Loader类的可能性。这个定制是通过反射来完成的。scala覆盖静态Java方法

... 
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) = ... 
} 

与graphClassName = “MyLoader $”

但没有成功。

已知和可行的解决方案是编写bridge Java类,但是如果存在某种“合法”方式来执行此操作,则会很有趣。

//  MyLoader.java 

public class MyLoader { 

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

} 

回答

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  
}