从跨应用程序/小程序 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/