Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何链接到一个包,但仅在运行时根据包的存在/可用性选择性地执行操作?_Java_User Interface_Accessibility - Fatal编程技术网

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

Java 如何链接到一个包,但仅在运行时根据包的存在/可用性选择性地执行操作?,java,user-interface,accessibility,Java,User Interface,Accessibility,从跨应用程序/小程序java可访问性服务的角度来看,您如何链接到一个包,但在运行时仅根据包(已加载)的存在性/可用性选择性地执行操作 我想我在这里感兴趣的是一种解决问题的方法,而不是两个应用程序之间共享对象的问题,这是在类加载器的更高级别加载的服务。 看起来反射是一种方法,但我不确定如何或者是否可以用这种方法实现派生类。我需要添加从特定可选类派生的特定侦听器,我可以使用applet类加载器加载侦听器,但内部仍然失败。假设您想添加一个JInternalFrameListener,但是Swing不能

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

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

问题的早期描述 对不起,我不太清楚该问什么,也不知道该如何说清楚,所以有点漫无边际

假设一个类使用了另一个类的某些功能,但是另一个类可能并不总是可用的——如果这是一个JNLP应用程序,那么就说从JNLP查找网站

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

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

现在我想将这个想法扩展到其他可选功能,但它似乎并没有始终如一地发挥作用

假设我想添加一些功能,以便在JRE1.6运行时使用与在JRE1.3中运行相同的jar和类执行更高级的操作,或者说我想在特定的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() ); 
  }
其中它打印出
类oracle.forms.ui.FormDesktopContainer
,然后使用NoClassDefFound在instanceof调用上抛出和异常,从而打印出
oracle/forms/ui/FormDesktopContainer


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

您可以通过调用

ClassLoader.getSystemClassLoader().loadClass("my.package.MyClass")

如果它抛出ClassNotFoundException,则它不可用。如果你得到了类对象,它就是。然后,您可以根据类是否可用来选择行为。

您可以通过调用

ClassLoader.getSystemClassLoader().loadClass("my.package.MyClass")

如果它抛出ClassNotFoundException,则它不可用。如果你得到了类对象,它就是。然后,您可以根据该类是否可用来选择行为。

这如何?混乱,但它应该起作用:

public boolean exists(String className){

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

这个怎么样?混乱,但它应该起作用:

public boolean exists(String className){

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

我建议根据最低目标编译大部分代码。将使用特定可选库的代码清楚地分开,但这取决于大部分代码。动态加载使用可选库的代码一次。主类应该做一些事情来检查静态初始化器中是否存在所需的库/版本

对于JNLP,JNLP主类静态加载依赖JNLP的代码


(请注意,试图从正常链接的代码中捕获与类加载相关的异常是不可靠的。)

我建议根据最低目标编译大部分代码。将使用特定可选库的代码清楚地分开,但这取决于大部分代码。动态加载使用可选库的代码一次。主类应该做一些事情来检查静态初始化器中是否存在所需的库/版本

对于JNLP,JNLP主类静态加载依赖JNLP的代码


(请注意,试图从正常链接的代码中捕获与类加载相关的异常是不可靠的。)

getSystemClass loader在这方面没有用处,因为有多个可能的类加载器根据给定窗口所在的小程序进行交互。在基类加载器上加载的辅助功能组件无法看到小程序特定的类

与对象交互反射完成了这项工作,尽管它确实增加了很多需要维护的内容

// statically linking would be
return component.getText();

// dynamically is
try {
  return (String)component.getClass().getMethod("getText", new Class [] {}).invoke(component, new Object [] {});
} catch (Throwable e) {
  e.printStackTrace();
}
更棘手的是编写一个派生自接口的类,该接口不可直接访问,使用代理服务可以实现这一点