ClassCastException when asInstanceOf for understanding

In PlayFramework 2.4, I am trying to convert all controller methods to JavaScript routes.

val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))

for (
  controller <- controllers;
  method <- controller.getClass.getDeclaredMethods
) yield method.invoke(controller).asInstanceOf[JavaScriptReverseRoute]

But the following error occurs:

Error injecting constructor, java.lang.ClassCastException: java.lang.String cannot be cast to play.api.routing.JavaScriptReverseRoute 
at controllers.Application.<init>(Application.scala:21)
while locating controllers.Application
   for parameter 1 at router.Routes.<init>(Routes.scala:35)
while locating router.Routes
while locating play.api.inject.RoutesProvider
while locating play.api.routing.Router

I am adding code, but I think this is unnecessary code. After this, an exception does not occur.

for (
  controller <- controllers;
  method <- controller.getClass.getDeclaredMethods;
  action <- method.invoke(controller).toString
) yield method.invoke(controller).asInstanceOf[JavaScriptReverseRoute]

Why does the error occur in the first code example, and not in the second?

+4
source share
1 answer

Take a look at the code step by step and see what each line gives. I have converted your code into a complete sample code, but I hope I capture the essence of your code.

package controllers

import play.api._
import play.api.mvc._

class Sample extends Controller {
  def hello(name: String) = Action {
    implicit req =>
    import routes.javascript._

    val jsRoutesClass = classOf[routes.javascript]
    val controllers = jsRoutesClass.getFields.map(_.get(null))
    val met = for (
        controller <- controllers;
        method <- controller.getClass.getDeclaredMethods
      ) yield method
    Ok(met.mkString(", "))
  }
}

When you run this query, you will see something like

public play.api.routing.JavaScriptReverseRoute controllers.javascript.ReverseSample.hello(), public java.lang.String controllers.javascript.ReverseSample._defaultPrefix()

, , _defaultPrefix() String.

. JavaScriptReverseRoute , , .

, . :

package controllers

import play.api._
import play.api.mvc._

class Sample extends Controller {
  def hello(name: String) = Action {
    implicit req =>
    import routes.javascript._

    val jsRoutesClass = classOf[routes.javascript]
    val controllers = jsRoutesClass.getFields.map(_.get(null))
    val met = for (
        controller <- controllers;
        method <- controller.getClass.getDeclaredMethods
      ) yield method.invoke(controller)
    Ok(met.mkString(", "))
  }
}

, , - :

JavaScriptReverseRoute(controllers.Sample.hello,
    function(name) {
      return _wA({method:"GET", url:"/" + (function(k,v) {return v})("name", encodeURIComponent(name))})
    }
  ), 

, , ,, , val met 0 JavaScriptReverseRoute 1 .

, , action <- method.invoke(controller).toString javascript , . , String , yield , .

, _.defaultPrefix() - , .

, :

package controllers

import play.api._
import play.api.mvc._

class Sample extends Controller {
  def hello(name: String) = Action {
    implicit req =>
      import routes.javascript._

      val jsRoutesClass = classOf[routes.javascript]
      val controllers = jsRoutesClass.getFields.map(_.get(null))
      val met = for (
          controller <- controllers;
          method <- controller.getClass.getDeclaredMethods if method.getReturnType() == classOf[play.api.routing.JavaScriptReverseRoute]
         ) yield  method.invoke(controller).asInstanceOf[play.api.routing.JavaScriptReverseRoute]
       Ok(met.mkString(", "))
  }
}

.

+4

All Articles