相关疑难解决方法(0)

在java中卸载类?

我有一个自定义类加载器,以便桌面应用程序可以动态地从我需要与之交谈的AppServer加载类.我们之所以这样做是因为要做这件事所需的罐子数量是荒谬的(如果我们想要运送它们).如果我们不在运行时从AppServer库动态加载类,我们也会遇到版本问题.

现在,我遇到了一个问题,我需要与两个不同的AppServer交谈,并发现根据我首先加载的类我可能会破坏...有没有办法强制卸载类而不实际杀死JVM?

希望这是有道理的

java classloader

170
推荐指数
5
解决办法
13万
查看次数

我的静态变量存活了多长时间?

我有一个类看起来像:

  public class BadCodeStyle {

     private static String theAnswer = null;

     public static void setAnswer(String whatsNew) {
         theAnswer = whatsNew;
     }

     public static String getAnswer() {
          return (theAnswer == null) ? "I don't know" : theAnswer;
     }            

  }
Run Code Online (Sandbox Code Playgroud)

当然这是实际课程的简化.真正发生的是静态方法如果变量为null则检索框架对象.设置变量只是为了在测试运行中插入一个模拟值,我希望将代码与框架隔离开来(为可测试性改造代码很有趣 - 就像戳你自己的眼睛类型的乐趣一样).

当我这样做时BadCodeStyle.setAnswer("42"),静态方法的行为类似于Singleton(?).我确实阅读了类加载器的解释并得出结论:只要加载了类,变量就会保留,只要JVM运行就可以了.那是对的吗?

java static-methods

5
推荐指数
1
解决办法
2043
查看次数

Android:我可以阻止Java类(来自外部库)在运行时实例化

上下文:

我使用AdMob中介在我的应用中显示横幅广告.我集成了Millennial广告网络SDK和Millennial AdMob适配器.

问题:我的应用支持Android API 9+,而Millennial SDK支持API 16+.更糟糕的是,SDK没有优雅地失败(没有向AdMob中介层返回任何广告,以便它可以继续沿着中介瀑布走下去),SDK在运行Android <16(Fatal Exception: java.lang.NoSuchMethodError android.webkit.WebSettings.setAllowUniversalAccessFromFileURLs)的设备上崩溃

显然千禧一代开发人员并不打算解决这个问题,他们建议发布2个不同的APK("<16"没有他们的SDK和"16+"他们的SDK),这是一个麻烦的解决方案.

我更喜欢更简单的解决方案:在运行Android API <16的设备上,我想重现AdMob适配器丢失时会发生的情况:AdMob中介只会转到下一个网络.这意味着在我实例化AdMod中介横幅之前卸载或删除 Millennial适配器类.

问题:

有没有办法在运行时阻止给定类(来自第三方库)的任何未来瞬间?(例如,通过强制ClassNotFound异常)

java android admob

5
推荐指数
1
解决办法
160
查看次数

如何以编程方式编译和运行 Scala 代码

我有以下代码,我想即时编译并运行它。

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过如下所示:

import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox

object MainScala {
  def main(args: Array[String]): Unit = {
    val toolbox = currentMirror.mkToolBox()
    val source =
      """
        |object HelloWorld {
        |  def main(args: Array[String]): Unit = {
        |    println("Hello, world!")
        |  }
        |}
        |""".stripMargin
    val tree = toolbox.parse(source)
    val binary = toolbox.compile(tree)
    var c = binary.getClass
    val m = c.getMethod("main", classOf[Array[String]])
    val params = Array("Apple", "Banana", "Orange")
    m.invoke(null, null)
  }
} …
Run Code Online (Sandbox Code Playgroud)

reflection scala scala-compiler scala-reflect

2
推荐指数
1
解决办法
302
查看次数