Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala能反映静态方法吗?_Java_Scala_Reflection_Static - Fatal编程技术网

Java Scala能反映静态方法吗?

Java Scala能反映静态方法吗?,java,scala,reflection,static,Java,Scala,Reflection,Static,我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我尝试使用我创建的URLClassloader的java方式,并通过getDeclaredMethod()反映该方法,但它似乎在Scala中不起作用。我在考虑Scala的方法,但是如果不创建一个特定的实例,似乎没有任何方法或字段可以被反映出来。 那么,是否有可能在Scala中反映静态方法呢?如果是,正确的方法是什么 抱歉,我想我犯了一个错误,它可以与JavaAPI一起工作。感谢guy.如果您提到Scala-reflect.ja

我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我尝试使用我创建的
URLClassloader
的java方式,并通过
getDeclaredMethod()
反映该方法,但它似乎在Scala中不起作用。我在考虑Scala的方法,但是如果不创建一个特定的实例,似乎没有任何方法或字段可以被反映出来。 那么,是否有可能在Scala中反映静态方法呢?如果是,正确的方法是什么


抱歉,我想我犯了一个错误,它可以与JavaAPI一起工作。感谢guy.

如果您提到Scala-reflect.jar中提供的Scala本机运行时反射API的功能,那么答案有两个:

  • 可以调用用Scala编写的“静态”方法(即在对象中定义的方法)
  • 不可能调用用Java编写的静态方法(这里有一个问题:)

  • 在我的搜索中找到这个问题后,我刚刚解决了这个问题,为了拯救那些通过谷歌搜索也找到这个问题的人:

    如果您有一个scala
    TypeTag
    WeakTypeTag
    ,那么实际上可以获得底层java类的
    java.lang.Class
    对象,从那里您可以使用java反射API来完成您想要做的事情:

    scala> import scala.reflect.runtime.universe._
    import scala.reflect.runtime.universe._
    
    scala> val wt = weakTypeTag[java.text.DateFormat]
    wt: reflect.runtime.universe.WeakTypeTag[java.text.DateFormat] = TypeTag[java.text.DateFormat]
    
    scala> val clazz = wt.mirror.runtimeClass(wt.tpe)
    clazz: Class[_] = class java.text.DateFormat
    
    scala> val fld = clazz.getDeclaredField("SHORT")
    fld: java.lang.reflect.Field = public static final int java.text.DateFormat.SHORT
    
    scala> val meth = clazz.getDeclaredMethod("getTimeInstance", fld.getType)
    meth: java.lang.reflect.Method = public static final java.text.DateFormat java.text.DateFormat.getTimeInstance(int)
    
    scala> val methResult = meth.invoke(null, fld.get(null))
    methResult: Object = java.text.SimpleDateFormat@b4dc7db3
    
    scala> methResult.asInstanceOf[java.text.Format].format(System.currentTimeMillis)
    res28: String = 9:15 AM
    
    帽尖给我指明了正确的方向


    请注意,scala方法对同伴对象的影响是完全不同的。可能会对您有所帮助。

    “它似乎在Scala中不起作用”不起作用的确切程度如何?您可以添加“不起作用”代码吗?更好地解释“不工作”的真正含义是什么?它的工作原理与Java中的工作原理相同。您可以使用所有Java反射API,并且它在Scala中的工作方式相同。