Posible duplicado: ¿Cómo acceder a las clases de Java en el paquete predeterminado?
Estoy usando Eclipse 3.5 y he creado un proyecto con alguna estructura de paquete junto con el paquete predeterminado. Tengo una clase en el paquete predeterminado: Calculations.java y quiero hacer uso de esa clase en cualquiera de los paquetes (por ejemplo, en com.company.calc
). Cuando intento hacer uso de la clase que está en el paquete predeterminado, me da un error de compilación. No puede reconocer la clase en el paquete predeterminado. ¿Dónde está el problema?
Calculations.java - código fuente
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
No puedo poner mi clase en ningún otro paquete. Esta clase tiene algunos métodos nativos que se implementan en Delphi. Si pongo esa clase en cualquiera de las carpetas, tendré que hacer cambios en esa DLL que quiero evitar (en realidad, no puedo). Por eso puse mi clase en el paquete predeterminado.
fuente
Respuestas:
De la especificación del lenguaje Java :
Tendrá que acceder a la clase a través de la reflexión o algún otro método indirecto.
fuente
Las clases en el paquete predeterminado no pueden ser importadas por clases en paquetes. Es por eso que no debe usar el paquete predeterminado.
fuente
Existe una solución para su problema. Puedes usar la reflexión para lograrlo.
Primero, cree una interfaz para su clase objetivo
Calculatons
:A continuación, haga que su clase objetivo implemente esa interfaz :
Finalmente, use la reflexión para crear una instancia de
Calculations
clase y asígnela a una variable de tipoCalculationsInterface
:fuente
Puedo darte esta sugerencia, por lo que sé de mi experiencia en programación C y C ++, una vez, cuando tuve el mismo problema, lo resolví cambiando la estructura escrita dll en el archivo ".C" cambiando el nombre del función que implementó la funcionalidad nativa de JNI. por ejemplo, si desea agregar su programa en el paquete "com.mypackage", cambie el prototipo del JNI que implementa la función / método del archivo ".C" a este:
Como soy nuevo en Delphi, no puedo garantizarle, pero diré esto finalmente (aprendí algunas cosas después de buscar en Google sobre Delphi y JNI): Pregúntele a esas personas (si no es usted) que proporcionaron la implementación de Delphi de la versión nativa. código para cambiar los nombres de las funciones a algo como esto:
Pero, un último consejo: aunque usted (si es el programador de Delphi) o ellos cambiarán los prototipos de estas funciones y volverán a compilar el archivo dll, una vez compilado el archivo dll, no podrá cambiar el nombre del paquete de su Archivo "Java" una y otra vez. Porque, esto requerirá nuevamente que usted o ellos cambien los prototipos de las funciones en delphi con prefijos cambiados (por ejemplo, JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName)
Creo que esto resuelve el problema. Gracias y saludos, Harshal Malshe
fuente
De algún lugar donde encontré a continuación: -
De hecho, puedes.
Usando la API de reflexiones puedes acceder a cualquier clase hasta ahora. Al menos pude :)
fuente
Desafortunadamente, no puede importar una clase sin que esté en un paquete. Esta es una de las razones por las que se desaconseja mucho. Lo que probaría es una especie de proxy: ponga su código en un paquete que cualquier cosa pueda usar, pero si realmente necesita algo en el paquete predeterminado, conviértalo en una clase muy simple que reenvíe las llamadas a la clase con el código real. O, incluso más simple, simplemente haz que se extienda.
Para dar un ejemplo:
fuente
Cree un nuevo paquete y luego mueva las clases del paquete predeterminado en un nuevo paquete y use esas clases
fuente
fuente
Cree un paquete (carpeta) "raíz" en su proyecto, por ejemplo.
fuente del paquete; (... / ruta_al_proyecto / fuente /)
Mueva YourClass.class a una carpeta de origen. (... / ruta_al_proyecto / fuente / YourClass.class)
Importar como este
import source.YourClass;
fuente