Comment obtenir un nom de package de .fichier de classe?

J'ai un problème inhabituel qui est concerné pour le chargement dynamique de java .fichier de classe au moment de l'exécution. Tout ce que je veux faire est de charger une .fichier de classe et de se fonder sur la création d'un objet de Classe.

D'entrée: un chemin d'accès absolu .fichier de classe.

En se basant sur ce que je veux à la classe de charge par le chargeur de classe, j'ai donc besoin d'un chemin de la racine du répertoire où est situé le fichier et le nom complet de la classe e.g com.test.MyClass. En se basant sur les cités chemin absolu je ne peux obtenir un nom de classe, mais je ne peux pas obtenir un nom de package qui est "invisible ils" dans ce fichier.

Voici le code de mon "chargement de la méthode de classe":

    public static void loadClass(String directory){

        //Get file root directory
        String rootDirectory = new File(directory).getParent();

        //Get rid of file extension
        String className = getFileNameWithoutExtension(directory);

        URL[] urls = null;
        ClassLoader cl = null;

        try {
            //Convert File to a URL and save them
            urls = new URL[]{new File(rootDirectory).toURI().toURL()};

            //Create a new class loader with the directory
            cl = new URLClassLoader(urls);

            //Load in the class
            dynamicClass = cl.loadClass(className);
        } 
        catch (MalformedURLException e) 
        {

    } 
    catch (ClassNotFoundException e) 
    {

    }
    catch (NoClassDefFoundError e)
    {
        //Basing on error message get the class package name
        String classPackage = getClassPackage(e.getMessage());

        try {             

           //Load the class once more!
           dynamicClass = cl.loadClass(classPackage);
        } 
        catch (ClassNotFoundException ex) 
        {

        }
    }
}

Deuxième méthode est utilisé pour obtenir le nom du package de message d'exception:

private static String getClassPackage(String errorMsg){

    //Start and end index of cutting
    int startIndex = errorMsg.lastIndexOf(" ") + 1;
    int endIndex = errorMsg.length() - 1;

    //Let's save a substring
    String classPackage = errorMsg.substring(startIndex, endIndex);

    //Replace char '/' to '.'
    classPackage = classPackage.replace('/', '.');

    return classPackage;
}

Code de la méthode getFileNameWithoutExtension:

private static String getFileNameWithoutExtension(String path){
    int start = path.lastIndexOf(File.separator) + 1;
    int end = path.lastIndexOf(DOT);
    end = start < end ? end : path.length();
    String name = path.substring(start, end);

    return name;
}

Où la statique de la variable finale est:

private static final String DOT = ".";

Et voici ma question: est-il possible de faire passer un paquet de nom de .fichier de classe sans utiliser ce genre de truc?

  • Pourquoi ne pas dynamicClass = cl.loadClass(className); de nouveau? D'ailleurs, quels sont exactement vous essayez de le faire de toute façon?
  • Je veux obtenir un nom de package pour l'insérer dans le constructeur de chargeur de classe: loadClass(>> ici <<). Lorsque vous l'appelez-vous besoin d'un nom complet de la classe qui comprend un nom de package.e.g: com.test.MyClass au lieu de MyClass. Et tout ce que je veux obtenir est: est-ce com.test.MyClass avant que je charge une classe.
  • Merci de poster votre getFileNameWithoutExtension méthode.
  • Je voulais le poster dans la question... les commentaires sont horribles pour structurer le code!
  • Je pense que tu veux dire "caché". Et encore une fois, merci d'éditer votre question et ajouter le code pour getFileNameWithoutExtension de la question. Dans tous les cas, le chemin d'accès au dossier est le même que le nom du paquet jusqu'où le premier paquet de dossier commence. Aussi, il n'est pas clair ce que vos résultats réels. Vous devez mettre une certaine forme de messages de débogage ou de quelque chose dans votre programme pour s'assurer qu'il est en cours d'exécution que vous avez l'intention de faire.
  • faire un tour 🙂 vous attend pour le courant de l'insigne qui apparaîtra sur votre profil... 😀

InformationsquelleAutor Wicia | 2014-01-04