代码之家  ›  专栏  ›  技术社区  ›  Erik

在Java中,如何引用在第三方库的默认包中的类?

  •  1
  • Erik  · 技术社区  · 16 年前

    我下载了一个第三方库,他们有我需要在默认包中引用的类?如何导入这些类?

    2 回复  |  直到 10 年前
        1
  •  7
  •   Jared Oberhaus    16 年前

    直接使用编译器是不可能的。Sun取消了此功能。如果某些内容在默认命名空间中,则所有内容都必须在默认命名空间中。

    但是,您可以使用 ClassLoader . 假设类被调用 Thirdparty ,并且它有一个静态方法调用 doSomething() ,可以这样执行:

    Class clazz = ClassLoader.getSystemClassLoader().loadClass("Thirdparty");
    java.lang.reflect.Method method = clazz.getMethod("doSomething");
    method.invoke(null);
    

    至少可以说这很乏味…

    很久以前,在Java 1.5之前的某个时候,你曾经能够 import Thirdparty; (来自未命名/默认命名空间的类),但不再是。看到这个 Java bug report . 一 bug report 如果要求解决无法使用默认名称空间中的类的问题,建议使用JDK1.3.1编译器。

        2
  •  2
  •   Joerg Vogel    13 年前

    为了避免无聊 method.invoke() 打电话时,我调整了上述解决方案:

    为所需的功能编写一个接口 my.package

    package my.package;
    public interface MyAdaptorInterface{
      public void function1();
      ...
    }
    

    在中编写适配器 default package :

    public class MyAdaptor implements my.package.MyAdaptorInterface{
      public void function1(){thirdparty.function1();}
      ...
    }
    

    使用类加载器/类型转换从访问对象 My.包

    package my.package;
    
    Class clazz = ClassLoader.getSystemClassLoader().loadClass("MyAdaptor");
    MyAdaptorInterface myObj = (MyAdaptorInterface)clazz.newInstance();
    myObj.function1();