加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用反射获取在Scala中实现特征的所有类

发布时间:2020-12-16 19:16:24 所属栏目:安全 来源:网络整理
导读:我想列出实现特定特征的所有案例类.我目前正在使用 Clapper ClassUtil这样做.我能够获得直接实现特征的案例类.但是,我无法获得其他没有直接实现特征的类.如何获得直接或间接实现特征的所有类. ? val finder = ClassFinder()finder.getClasses().filter(_.is
我想列出实现特定特征的所有案例类.我目前正在使用 Clapper ClassUtil这样做.我能够获得直接实现特征的案例类.但是,我无法获得其他没有直接实现特征的类.如何获得直接或间接实现特征的所有类. ?

val finder = ClassFinder()
finder.getClasses().filter(_.isConcrete).filter(_.implements("com.myapp.MyTrait"))

Scala版本:2.11

Clapper Class Util版本:1.0.6

有没有其他方法可以获得这些信息?有人能指出我正确的方向吗?
我尝试使用scala.reflect但无法理解如何获取信息.

EDIT:

样本特征和用法:

trait BaseEntity
trait NamedEntity{ val name:String}
trait MasterDataEntity extends NamedEntity

case class Department(id:Long,override val name:String) extends MasterDataEntity
case class Employee(id:Long,name:String) extends BaseEntity
case class User(id:Long,override val name:String) extends NamedEntity

现在,如果我将特征赋予NamedEntity,我应该能够同时获得Department和User,因为它们都直接或间接地实现了NamedEntity.使用implements方法,它只给User.我也试过使用接口方法,它也只提供直接超类.

解决方法

看看 source code,问题似乎是它不遵循接口层次结构.如果您这样做,您会找到所有实例:

package foo

import java.io.File

import org.clapper.classutil.{ClassFinder,ClassInfo}

object Main extends App {
  val jar     = new File("target/scala-2.11/class_test_2.11-0.1.0.jar")
  val finder  = ClassFinder(jar :: Nil)
  val classes = ClassFinder.classInfoMap(finder.getClasses().iterator)
  val impl    = find("foo.NamedEntity",classes)
  impl.foreach(println)

  def find(ancestor: String,classes: Map[String,ClassInfo]): List[ClassInfo] =
    classes.get(ancestor).fold(List.empty[ClassInfo]) { ancestorInfo =>
      val ancestorName = ancestorInfo.name

      def compare(info: ClassInfo): Boolean =
        info.name == ancestorName ||
        (info.superClassName :: info.interfaces).exists {
          n => classes.get(n).exists(compare)
        }

      val it = classes.valuesIterator
      it.filter { info => info.isConcrete && compare(info) } .toList
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读