java - 如何获取.class文件的包名?

标签 java class reflection runtime package

我有一个不寻常的问题,它与在运行时动态加载 java .class 文件有关。我想要做的就是加载一个 .class 文件并基于它创建一个 Class 对象。

输入:.class 文件的绝对路径。

基于它,我想通过 ClassLoader 加载类,所以我需要一个文件所在的根目录的路径和完整的类名,例如 com.test.MyClass。基于提到的绝对路径,我只能得到一个类名,但我不能得到一个在这个文件中“隐藏”的包名。

这是我的“加载类方法”的代码:

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

static final 变量在哪里:

private static final String DOT = ".";

这是我的问题:是否可以在不使用这种技巧的情况下从 .class 文件中获取包名称?

最佳答案

您可以使用 Foo.class.getPackage().getName() 方法来确定这一点。

    public Package getPackage()

返回:

the package of the class, or null if no package information is available from the archive or codebase.

使用 getName() :

    public String getName()

返回:

The fully-qualified name of this package as defined in section 6.5.3 of The Java™ Language Specification, for example, java.lang

关于java - 如何获取.class文件的包名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20925024/

相关文章:

JAVA AES 256 解密

java - 与其他类的变量进行比较

c# - 在 C# 中访问类文件中的母版页

c# - 获取同名方法的集合

java - @Autowired 不能在类实例使用反射创建的类内部工作

java - 无法连接到远程MySQL服务器

java - 用比较器比较不同的对象类型

objective-c - 任何人都可以举例说明在 Objective-C 中针对普通类而不是类别或协议(protocol)的前向声明吗?

jquery - 检查类为 'X' 的元素是否具有 'N' 的 rel

go - 如何在 golang 中创建结构运行时