【问题标题】:How to Get Package Name of Source Class File in Android ?如何在Android中获取源类文件的包名?
【发布时间】:2013-01-31 03:10:47
【问题描述】:

我只使用一个项目来移植 lite 和完整版本,因为我只是在更新 Manifest 文件包名称。

我的项目结构是这样的

我的应用
|_src
|_com.example.myapp
|_MyClass.java

和我的 Manifest 包名不同。

package="com.example.myapplite"

我正在使用一个库项目,因为我想要在 MyApp 中使用的类的包名。

我用过这个

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

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

我想要 MyClass.java 包名。 IE。 com.example.myapp

我也知道这一点

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

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

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

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

【问题讨论】:

  • 试试这个:YourClass.class.getPackage().getName();
  • 不清楚为什么你会使用new MyClass().getClass()(有效地)而不仅仅是MyClass.class...或者为什么这对你来说还不够。您对使用 Class.forName 的解释并不能真正解释您要做什么。你希望做什么Class.getPackage()不适合你?
  • 我正在使用库项目,要在我的库项目中使用 MyClass 我需要访问它 Class.forName("package_name.MyClass");因为库项目不知道 MyClass.java
  • 我也不能在访问之前创建 MyClass 的对象。

标签: java android class android-library package-managers


【解决方案1】:

可能会有所帮助

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");要访问该类,我需要包名。
  • 请注意,如果类的类加载器未注册包,Class.getPackage() 可能会返回 null。这通常通过使用 ClassLoader.definePackage() 在 ClassLoader 中完成。您可以在例如 URLClassLoader 中看到这一点。如果您没有安装自定义 ClassLoader,则应该没有任何问题,因为默认 ClassLoader 将在加载类时定义包。
  • 输出是什么?
【解决方案2】:

Kotlin 解决方案:

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

【讨论】:

    【解决方案3】:
    String packageName = this.getClass().getPackage().getName();
    

    肯定会起作用。

    【讨论】:

      【解决方案4】:

      试试这个,

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

      【讨论】:

      • 这个解决方案看起来不错,但是有没有办法在不创建新实例的情况下获取包名?
      • @FelipeMosso 只需在任何实例上使用 .getClass().getPackage().getName() 或使用 [YourClassName].class.getPackage().getName()
      【解决方案5】:

      某类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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        相关资源
        最近更新 更多