Java - 获取当前的类名?

时间:2011-06-07 20:46:22

标签: java class classname

我所要做的就是获取当前的类名,并且java在我的类名末尾添加了一个无用的无意义 $ 1 。如何摆脱它并只返回实际的类名?

String className = this.getClass().getName();

12 个答案:

答案 0 :(得分:228)

“$ 1”不是“无用的无意义”。如果您的班级是匿名的,则会附加一个数字。

如果你不想要类本身,但是它的声明类,那么你可以使用getEnclosingClass()。例如:

Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
  System.out.println(enclosingClass.getName());
} else {
  System.out.println(getClass().getName());
}

您可以使用某种静态实用方法移动它。

但请注意,这不是当前的类名。匿名类与其封闭类不同。对于内部类,情况类似。

答案 1 :(得分:194)

尝试,

String className = this.getClass().getSimpleName();

只要您不在静态方法中使用它,它就会起作用。

答案 2 :(得分:27)

尝试使用此功能 this.getClass().getCanonicalName()this.getClass().getSimpleName()。如果是匿名类,请使用this.getClass().getSuperclass().getName()

答案 3 :(得分:9)

您可以使用this.getClass().getSimpleName(),如下所示:

import java.lang.reflect.Field;

public class Test {

    int x;
    int y;  

    public void getClassName() {
        String className = this.getClass().getSimpleName(); 
        System.out.println("Name:" + className);
    }

    public void getAttributes() {
        Field[] attributes = this.getClass().getDeclaredFields();   
        for(int i = 0; i < attributes.length; i++) {
            System.out.println("Declared Fields" + attributes[i]);    
        }
    }

    public static void main(String args[]) {

        Test t = new Test();
        t.getClassName();
        t.getAttributes();
    }
}

答案 4 :(得分:3)

这个答案很晚,但我认为在匿名处理程序类的上下文中还有另一种方法可以做到这一点。

让我们说:

class A {
    void foo() {
        obj.addHandler(new Handler() {
            void bar() {
                String className=A.this.getClass().getName();
                // ...
            }
        });
    }
}

它将达到相同的效果。另外,它实际上非常方便,因为每个类都是在编译时定义的,因此不会损坏动态性。

以上,如果该类实际上是嵌套的,即A实际上被B包围,则B的类可以很容易地称为:

B.this.getClass().getName()

答案 5 :(得分:3)

两个答案的组合。还会输出方法名称:

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);

答案 6 :(得分:2)

在您的示例中,this可能是指匿名类实例。 Java通过将$number附加到封闭类的名称来为这些类指定名称。

答案 7 :(得分:2)

这里是Android的变体,但是相同的原理也可以在纯Java中使用。

private static final String TAG = YourClass.class.getSimpleName();
private static final String TAG = YourClass.class.getName();

答案 8 :(得分:1)

我假设这是一个匿名课程。当您创建一个匿名类时,您实际上创建了一个类,该类扩展了您的名字所在的类。

获得所需名称的“清洁”方式是:

如果您的类是匿名内部类,getSuperClass()应该为您提供创建它的类。如果你是从一个接口创建它而不是你的SOL,因为你可以做的最好的是getInterfaces(),它可能会为你提供多个接口。

“hacky”方式是使用getClassName()获取名称并使用正则表达式删除$1

答案 9 :(得分:0)

就我而言,我使用这个 Java 类:

private String getCurrentProcessName() {
    String processName = "";
    int pid = android.os.Process.myPid();
    
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
        if (processInfo.pid == pid) {
            processName = processInfo.processName;
            break;
        }
    }
    
    return processName;
}

答案 10 :(得分:-3)

我发现这适用于我的代码,但是我的代码是从for循环中的数组中获取类。

String className="";

className = list[i].getClass().getCanonicalName();

System.out.print(className); //Use this to test it works

答案 11 :(得分:-3)

Reflection APIs

  

有几个Reflection API可以返回类,但这些可以   只有在已经直接获得班级时才能访问   或间接地。

n
     

返回作为成员的所有公共类,接口和枚举   该类包括继承成员。

Class.getSuperclass()
     Returns the super class for the given class.

        Class c = javax.swing.JButton.class.getSuperclass();
        The super class of javax.swing.JButton is javax.swing.AbstractButton.

        Class.getClasses()
     

Character包含两个成员类Character.Subset和
  Character.UnicodeBlock。

        Class<?>[] c = Character.class.getClasses();
     

Character.CharacterCache。

        Class.getDeclaredClasses()
         Returns all of the classes interfaces, and enums that are explicitly declared in this class.

        Class<?>[] c = Character.class.getDeclaredClasses();
     Character contains two public member classes Character.Subset and Character.UnicodeBlock and one private class
     

有一个封闭的课程。

        Class.getDeclaringClass()
        java.lang.reflect.Field.getDeclaringClass()
        java.lang.reflect.Method.getDeclaringClass()
        java.lang.reflect.Constructor.getDeclaringClass()
     Returns the Class in which these members were declared. Anonymous Class Declarations will not have a declaring class but will