簡體   English   中英

如何獲取.class文件的軟件包名稱?

[英]How to get a package name of .class file?

我有一個不尋常的問題,它涉及在運行時動態加載java .class文件。 我要做的就是加載一個.class文件,並基於它創建一個Class對象。

輸入:.class文件的絕對路徑。

基於此,我想通過ClassLoader加載類,因此我需要文件所在的根目錄的路徑以及完整的類名,例如com.test.MyClass。 基於提到的絕對路徑,我只能得到一個類名,但不能得到在此文件中為“ hiden”的包名。

這是我的“加載類方法”的代碼:

    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) 
        {

        }
    }
}

第二種方法用於從異常消息中獲取程序包名稱:

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;
}

方法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;
}

靜態最終變量為:

private static final String DOT = ".";

這是我的問題:是否可以使用這種技巧從.class文件中獲取軟件包名稱?

您可以使用Foo.class.getPackage().getName()方法確定此問題。

    public Package getPackage()

返回值:

類的包;如果歸檔或代碼庫中沒有包信息,則返回null。

使用getName():

    public String getName()

返回值:

如Java™語言規范的6.5.3節中所定義,此程序包的標准名稱,例如java.lang

由於您已經在className包含了必需的數據,因此只需再次使用它即可。 您不需要getClassPackage方法。

    catch (NoClassDefFoundError e)
    {
        // Basing on error message get the class package name
        //But we already have the class name in className variable!
        //String classPackage = getClassPackage(e.getMessage());

        try {             

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

        }
    }

如果只想獲取包名(不知道為什么),則可以從類名中獲取:

String packageName = className.substring(0, className.lastIndexOf('.'));
dynamicClass = cl.loadClass(packageName);

你可以這樣-

String packName = new Object(){}.getClass().getPackage().getName();        
System.out.println(packName);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM