java - 如何链接到包但仅根据运行时包的存在/可用性选择性地执行操作?

标签 java user-interface accessibility

从跨应用程序/小程序 Java 可访问性服务的角度来看,如何链接到包但仅根据运行时包(已加载)的存在/可用性选择性地执行操作?

我认为我在这里感兴趣的是解决 class identity crisis 的方法但问题不是两个应用程序共享对象之间的问题,而是在类加载器的更高级别加载的服务。 看起来反射是可行的方法,但我不确定如何或是否可以通过这种方式实现派生类。我需要添加从特定可选类派生的特定监听器,我可以使用小程序类加载器加载监听器,但内部仍然失败。假设您想添加一个 JInternalFrameListener,但 Swing 不保证可用,使用反射您可以找到添加监听器的方法,但是如果找不到任何相关类,您如何创建并让框架监听器工作因为它们在基类加载器中找不到!我是否需要创建一个线程并对了解 swing 的类加载器使用 setContextClassLoader 以便我可以可靠地加载类?只是尝试在现有线程上设置类加载器似乎不起作用。

之前的问题描述 抱歉,我不太确定要问什么或如何说清楚,所以有点啰嗦。

假设一个类使用另一个类的某些功能,但另一个类可能并不总是可用 - 假设这是一个 JNLP 应用程序,则从 JNLP 查找网站。

在某个阶段,我认为简单地针对 JNLP 进行编译意味着除非 JNLP 可用,否则我的类不会加载,因此为了识别这个可选部分,我简单地包装了一个 try{} catch( NoClassDefFoundError ) 围绕它。

后来发生了一些变化(也许改变了 jdk 或者??我不记得了),似乎我还应该使用 try{} catch( ClassNotFoundException )

现在我想将这个想法扩展到其他可选功能,但它似乎并不能始终如一地工作。

假设我想添加一些功能,以便使用与在 JRE1.3 中运行的相同的 jar 和类在 JRE1.6 运行时中执行更高级的操作,或者说我想在特定的 gui 工具包中处理一些控件,其中可能并不总是像 SWT 或 oracle.forms 那样使用。

有什么方法可以更可靠地做到这一点吗?引发异常并捕获它并始终忽略它似乎是错误的。

当前问题归结为能够针对 oracle.forms 进行编译,但安装在 ext 中的辅助功能组件无法访问 oracle.forms 类,即使已经创建了 oracle.forms 包中的对象。如果我将 frmall.jar 放入 ext 目录中进行测试,则可访问性组件会由于同一包的不同版本而变得不稳定。

我似乎陷入了类加载器不正确的问题(??)。如何找到合适的?

编辑: 到目前为止的答案有点有趣,但并没有完全让我到达我想要的地方。

就 gui 组件而言,我目前以工厂的形式编译,例如......

import oracle.forms.ui.*;
import java.awt.*;
static public IComponentNode newNode( INode parent, Component component ) {
  System.out.println( component.getClass().toString() );
  try{
  if( component instanceof FormDesktopContainer )
     ... does stuff here like return new FormDesktopNode( parent, (FormDesktopContainer) component )
  } catch ( NoClassDefFoundError a ) {
    System.out.println( a.getMessage() ); 
  }

它打印出class oracle.forms.ui.FormDesktopContainer,然后在使用NoClassDefFound的instanceof调用上抛出异常,从而打印出oracle/forms/ui/FormDesktopContainer

那么它怎么可能有一个类的实例却找不到它呢?

最佳答案

这个怎么样?很乱,但它应该可以工作:

public boolean exists(String className){

  try {
      Class.forName(className);
      return true;
      }
  catch (ClassNotFoundException){
      return false;
  }
}

关于java - 如何链接到包但仅根据运行时包的存在/可用性选择性地执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/752183/

相关文章:

java - 我的 Android Studio 模拟器一直显示错误消息

java - Jersey : combine multiple path params into one

java - GUI 中的 JButton

java - 如何关闭 Java SE 中的主 GUI?

Android:辅助功能服务中的 getRootInActiveWindow 会导致 ANR 吗?

macos - 在 OSX 上切换 chromevox

java - 流式传输 anyMatch 失败,出现 "Incompatible types"错误

java - 在 JVM 之间共享数据

java - BlackBerry 布局管理器问题,虚拟大小

javascript - 我们是否应该考虑禁用 javascript 的用户的可访问性?