2010-05-18 11 views
5

tengo un Client.java clase en dos frascos diferentes jar1 & jar2 Ahora en tiempo de ejecución Quiero decidir qué Client.class cargado comocómo cargar misma clase de diferentes frascos

if (country==india){ 
     // load Client class of jar1 
) else{ 
     load client class from jar2 
} 

puedo hacer que ...

Respuesta

4

Deberá utilizar el nombre "completo" de la ruta. Por ejemplo:

if (country==india){ 
     name.first.package.Client client = new name.first.package.Client(); 
} else{ 
     name.second.package.Client client = new name.second.package.Client(); 
} 

En fin ... que iba a tratar de evitar hacer cosas por el estilo ... que hacen que su código sea difícil de leer y MANTENER.

+2

Siempre suponiendo que se encuentran en DIFERENTES paquetes. – bmargulies

3

Si realmente tiene dos copias de una clase, con exactamente el mismo nombre completamente calificado, en dos frascos, entonces ...

Si usted quiere estar seguro, no debería poner cualquiera de ellos en el classpath de su cargador de clases predeterminado. Tendrá que crear dos cargadores de clases adicionales, y poner uno de los frascos en cada uno. Necesitará obtener una Clase para las dos clases, y deberá usar la reflexión para crear la instancia de la que desea.

+0

No estoy seguro de por qué esta respuesta fue downvoted. Bueno, supongo que para ser exacto, funcionaría poner una versión de la clase en el cargador de clases predeterminado, pero el otro tiene que estar en su propio cargador de clases. –

+0

No lo sé. Sin comentarios, por lo que a alguien no le gusta, pero no sabemos por qué. – bmargulies

7

Si las 2 clases tienen el mismo nombre de paquete, es decir, com.miempresa.Cliente , entonces terminas en una situación en la que es algo arbitrario qué versión de Cliente está cargada. Todo se reduce a lo que está en el classpath primero. Esta es una situación infierno JAR http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell.

Esta es una buena situación para evitar, pero si absolutamente debe tener diferentes versiones de la misma clase, hay formas de hacerlo. Una forma es usar un cargador de clases personalizado y el cargador de clases sabrá qué versión necesitas hacer. Esto no es algo trivial y puede ser difícil de manejar. El marco OSGi es una alternativa para ayudar a administrar esto (usa cargadores de clases personalizados bajo el capó), pero no usaría eso si solo tiene una instancia de una clase, ya que es otro marco que requiere tiempo y mantenimiento.

En pocas palabras: evite la situación si puede y tome el camino de menor resistencia si no puede.

Si las clases tienen diferentes nombres de paquete, @Casidiablo ha proporcionado una buena respuesta.

0

yo creo que hay 2 maneras:

1) Definir una interfaz de cliente, e implementa diferentes clases, por ejemplo: IndiaClient y Country2Client; Entonces

 

    interface Client {...} 
    class IndiaClient implements Client {...} 
    class Country2Client implements Client {...} 

    Client client; 
    if (country==india){ 
     client = new IndiaClient(); 
    ) else{ 
     client = new Country2Client(); 
    } 

2) Mantenga su camino con el mismo nombre de la clase en 2 archivos jar diferentes, pero todavía se necesita un interfaz o superclase, y utilizar diferentes cargadores de clases para cargar sus clases de clientes:

 

    interface IClient {...} 
    class Client implements IClient {...} // in jar1 
    class Client implements IClient {...} // in jar2 

    Class<IClient> clientClass; 
    if (country==india){ 
     clientClass = classLoader1.loadClass("package.Client"); 
    ) else{ 
     clientClass = classLoader2.loadClass("package.Client"); 
    } 
    IClient client = clientClass.newInstance(); 

  • En cuanto a cómo obtener la clase Loaders, puede consultar los documentos JDK.
Cuestiones relacionadas