通过反射列出 Scala 嵌套对象方法
Listing Scala nested objects methods through Reflection
我有以下 Scala 对象:
object BusinessFacade {
/**
* Fachada para acesso aos métodos de controle de Usuário
*/
object Usuario {
private lazy val usuarioBC = new UsuarioBC
def buscar(id: Long)(implicit s: Session) = {
usuarioBC.findById(id)
}
def inserir(usuario: User)(implicit s: Session) = {
usuarioBC.insert(usuario)
}
def alterar(id: Long, usuario: User)(implicit s: Session) = {
usuarioBC.update(id, usuario)
}
def remover(id: Long)(implicit s: Session) = {
usuarioBC.delete(id)
}
def listar(numeroDaPagina: Int = 0, tamanhoDaPagina: Int = 10, filtro: String = "%")(implicit s: Session): Page[User] = {
usuarioBC.list(numeroDaPagina, tamanhoDaPagina, filtro)
}
}
/**
* Fachada para acesso aos métodos de controle de Perfil
*/
object Perfil {
private lazy val perfilBC = new PerfilBC
}
/**
* Fachada para acesso aos métodos de controle de Sistema
*/
object Sistema {
private lazy val sistemaBC = new SistemaBC
}
}
我想获取每个内部对象的每个声明方法的名称,所以我尝试通过以下方式实现:
val facadeType = typeOf[BusinessFacade.type]
var permissoes = facadeType.members.filter(_.isModule).foreach { m =>
println(m.name + " ========================")
typeOf[m.type].decls.filter(_.isMethod).foreach(println)
}
使用这段代码,我得到了每个内部对象的名称,但没有得到声明的方法。
谁能告诉我为什么,我怎样才能得到这些方法的名称??
当前输出:
Sistema ========================
Perfil ========================
Usuario ========================
期望的输出:
Sistema ========================
Perfil ========================
Usuario ========================
buscar
inserir
alterar
remover
listar
当您在 foreach
中使用 typeOf[m.type]
时,您得到的是 m
实例的类型,它的类型是 Symbol
,所以这不是'不是你想要的。您可以在 Symbol
上使用 info
方法来获取您要查找的 Type
实例:
typeOf[BusinessFacade.type].members.filter(_.isModule).foreach { m =>
println(m.name + " ========================")
m.info.decls.filter(_.isMethod).foreach(println)
}
我有以下 Scala 对象:
object BusinessFacade {
/**
* Fachada para acesso aos métodos de controle de Usuário
*/
object Usuario {
private lazy val usuarioBC = new UsuarioBC
def buscar(id: Long)(implicit s: Session) = {
usuarioBC.findById(id)
}
def inserir(usuario: User)(implicit s: Session) = {
usuarioBC.insert(usuario)
}
def alterar(id: Long, usuario: User)(implicit s: Session) = {
usuarioBC.update(id, usuario)
}
def remover(id: Long)(implicit s: Session) = {
usuarioBC.delete(id)
}
def listar(numeroDaPagina: Int = 0, tamanhoDaPagina: Int = 10, filtro: String = "%")(implicit s: Session): Page[User] = {
usuarioBC.list(numeroDaPagina, tamanhoDaPagina, filtro)
}
}
/**
* Fachada para acesso aos métodos de controle de Perfil
*/
object Perfil {
private lazy val perfilBC = new PerfilBC
}
/**
* Fachada para acesso aos métodos de controle de Sistema
*/
object Sistema {
private lazy val sistemaBC = new SistemaBC
}
}
我想获取每个内部对象的每个声明方法的名称,所以我尝试通过以下方式实现:
val facadeType = typeOf[BusinessFacade.type]
var permissoes = facadeType.members.filter(_.isModule).foreach { m =>
println(m.name + " ========================")
typeOf[m.type].decls.filter(_.isMethod).foreach(println)
}
使用这段代码,我得到了每个内部对象的名称,但没有得到声明的方法。
谁能告诉我为什么,我怎样才能得到这些方法的名称??
当前输出:
Sistema ========================
Perfil ========================
Usuario ========================
期望的输出:
Sistema ========================
Perfil ========================
Usuario ========================
buscar
inserir
alterar
remover
listar
当您在 foreach
中使用 typeOf[m.type]
时,您得到的是 m
实例的类型,它的类型是 Symbol
,所以这不是'不是你想要的。您可以在 Symbol
上使用 info
方法来获取您要查找的 Type
实例:
typeOf[BusinessFacade.type].members.filter(_.isModule).foreach { m =>
println(m.name + " ========================")
m.info.decls.filter(_.isMethod).foreach(println)
}