如何在Android中获取源类文件的包名?

14

我只使用了一个项目来移植精简版和完整版,我只需更新清单文件中的包名。

我的项目结构如下:

My App
      |_src
          |_com.example.myapp
                                              |_MyClass.java

而我的清单包名则不同:

package="com.example.myapplite"

我在其中使用了一个库项目,我想要使用在MyApp中的类的包名。

我已经使用了这个方法。

        System.out.println("Package Name " + context.getPackageName());

但它给了我一个清单文件包名称值,即com.example.myapplite

我想要MyClass.java的包名称。即com.example.myapp

此外,我知道这一点。

 MyClass mClass = new MyClass();
 Package pack = mClass.getClass().getPackage();

但是我无法使用这种方法,因为我正在使用以下方法在我的库项目中获取类文件

Class c = Class.forName("package_name.MyClass");

如何以编程方式获取MyClass.java文件的包名?


1
尝试使用以下代码:YourClass.class.getPackage().getName(); - Martin
不清楚你为什么要使用 new MyClass().getClass()(实际上)而不是 MyClass.class...或者为什么这对你来说还不够。你对使用 Class.forName 的解释并没有真正说明你想做什么。你希望能做些什么,Class.getPackage() 不能为你完成吗? - Jon Skeet
我正在使用库项目,为了在我的库项目中使用MyClass,我需要访问它的Class.forName("package_name.MyClass"),因为库项目不知道MyClass.java。 - Mac
同时,在访问 MyClass 之前,我无法创建 MyClass 的对象。 - Mac
5个回答

12

可能会有帮助

package org.kodejava.example.lang;
import java.util.Date;

public class ObtainingPackageName {
public static void main(String[] args) {
    //
    // Create an instance of Date class, and then obtain the class package
    // name.
    //
    Date date = new Date();
    Package pack = date.getClass().getPackage();
    String packageName = pack.getName();
    System.out.println("Package Name = " + packageName);

    //
    // Create an insatnce of our class and again get its package name
    //
    ObtainingPackageName o = new ObtainingPackageName();
    packageName = o.getClass().getPackage().getName();
    System.out.println("Package Name = " + packageName);
   }
} 

我正在使用库项目,因此在访问它之前无法创建 MyClass 的对象。我正在使用 Class.forName("package_name.MyClass"); 来访问该类,因此我需要包名称。 - Mac
1
请注意,如果类加载器未注册包,则Class.getPackage()可能返回null。这通常是通过使用ClassLoader.definePackage()在ClassLoader内部完成的。您可以在例如URLClassLoader中看到此操作的实际效果。如果您没有安装自定义ClassLoader,则不应该有任何问题,因为默认的ClassLoader将在加载类时定义包。 - Timmos
输出是什么? - winklerrr

5

Kotlin解决方案:

val packageName = this.javaClass.`package`?.name

3
String packageName = this.getClass().getPackage().getName();

肯定能够工作。


1

这是一个关于类NotificationListener的简单示例:

Timber.d(NotificationListener.class.getPackage().getName());
Timber.d(NotificationListener.class.getSimpleName());
Timber.d(NotificationListener.class.getName());

输出:

D/PermissionsUtil: com.example.receivers
D/PermissionsUtil: NotificationListener
D/PermissionsUtil: com.example.receivers.NotificationListener

1

try this,

    try {
        Class c = Class.forName("package_name.MyClass");

        Object o = c.newInstance();

        Package p = o.getClass().getPackage();

        System.out.println("Package Name :: " + p.getName());

    } catch (ClassNotFoundException e) {            
        e.printStackTrace();
    } catch (InstantiationException e) {            
        e.printStackTrace();
    } catch (IllegalAccessException e) {            
        e.printStackTrace();
    }

这个解决方案看起来不错,但是有没有一种方法可以在不创建新实例的情况下获取此包的名称? - Felipe Mosso
只需在任何实例上使用.getClass().getPackage().getName()或使用[YourClassName].class.getPackage().getName() - winklerrr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接