2017-02-20 38 views
1

Я хочу удалить следующий импорт:Как отрегулировать строку для правильного ввода типа classOf в scala?

import my.package.version.class1 

причина в том, что я хочу передать version в качестве параметра, так что я могу иметь следующие варианты:

my.package.version1.class1 
my.package.version2.class1 
my.package.version3.class1 

Когда я делаю это трудно -coded как это работает

classOf[my.package.version1.class1].getPackage 

Но мне нужно, чтобы быть строка типа, так что я могу присоединить версию каждый раз.

val hh = "my.package."+versionParamater+".class1" 



classOf[hh].getPackage //THIS WONT WORK error: identifier expected but string literal found. 

Я также пытался делать это, и оно не работает, а также:

val pkg = Package.getPackage(" my.package.version1.class1"); 

пожалуйста, вы можете помочь?

ответ

1

Вы можете использовать java.lang.Class.forName(fullClassPackage).

Пример,

val versionParamater = "version1" 
    val fullPackage = "my.package."+versionParamater+".class1" 
    val versionedClass = Class.forName(fullPackage) 
    assert(versionedClass.getSimpleName == "class1") 
    assert(versionedClass.getPackage.getName == "my.package.version1") 
3

Вам нужно будет вернуться к методу java.lang.Class.forName, чтобы овладеть классом. Но учтите, что вы вернете Class<?>, а не Class<class1>. Например:

scala> Class.forName("java.lang.String") 
res0: Class[_] = class java.lang.String 

Вы можете бросить его, хотя:

scala> res0.asInstanceOf[Class[String]] 
res1: Class[String] = class java.lang.String 

А неправильного гипс будет не результата в ClassCastException:

scala> res0.asInstanceOf[Class[Integer]] 
res2: Class[Integer] = class java.lang.String