Вопрос:

В чем разница между a.getClass () и A.class в Java?

java class reflection

36204 просмотра

7 ответа

15116 Репутация автора

В Java какие плюсы / минусы существуют вокруг выбора использовать a.getClass()или A.class? Любой из них может быть использован везде, где Class<?>ожидается, но я представляю, что при использовании обоих в различных обстоятельствах будет производительность или другие тонкие преимущества (как и в случае с Class.forName()и ClassLoader.loadClass().

Автор: IAmYourFaja Источник Размещён: 08.06.2012 11:13

Ответы (7)


154 плюса

337986 Репутация автора

Решение

Я бы не сравнивал их с точки зрения плюсов / минусов, поскольку они имеют разные цели, и между ними редко бывает «выбор».

  • a.getClass()возвращает тип выполнения из a. Т.е. если у вас A a = new B();тогда a.getClass()вернется Bкласс.

  • A.classоценивает Aкласс статически и используется для других целей, часто связанных с рефлексией.

С точки зрения производительности, может быть ощутимая разница, но я ничего не скажу об этом, потому что в конечном итоге это зависит от JVM и / или компилятора.


Этот пост был переписан как статья здесь .

Автор: aioobe Размещён: 08.06.2012 11:16

32 плюса

279270 Репутация автора

Они на самом деле разные в отношении того, где вы можете их использовать. A.classработает во время компиляции, в то время как a.getClass()требует экземпляра типа Aи работает во время выполнения.

Также может быть разница в производительности. Хотя A.classможет быть разрешено компилятором, поскольку он знает фактический тип A, a.getClass()это вызов виртуального метода, происходящий во время выполнения.

Для справки: байт-код, ориентированный на компилятор, обычно выдает следующие инструкции для Integer.getClass():

aload_1
invokevirtual   #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;

и следующее для Integer.class:

//const #3 = class  #16;    //  java/lang/Integer

ldc_w   #3; //class java/lang/Integer

Первый тип обычно включает в себя отправку виртуального метода и, следовательно, предположительно занимает больше времени для выполнения. Это, в конце концов, зависит от JVM.

Автор: Tomasz Nurkiewicz Размещён: 08.06.2012 11:16

6 плюса

22678 Репутация автора

взгляните на примеры ниже

a.getClass()!= A.classт.е. не экземпляр A, а анонимный подкласс A

a.getClass() требуется экземпляр типа A

Автор: Massimiliano Peluso Размещён: 08.06.2012 11:17

1 плюс

920 Репутация автора

Есть одно отличие, которое я хотел бы добавить. Допустим, у вас есть класс конструктор, как показано ниже, с суперклассом, который принимает объект Class. Вы хотите, чтобы при создании объекта подкласса объект класса подкласса передавался суперклассу. Код ниже не скомпилируется, так как вы не можете вызвать метод экземпляра в конструкторе. В этом случае, если вы замените myObject.getClass()на MyClass.class. Это будет работать отлично.

Class MyClass
{
    private MyClass myObject = new MyClass();
    public MyClass()
    {
        super(myObject.getClass()); //error line compile time error
    }
}
Автор: prashant Размещён: 08.06.2012 03:54

4 плюса

2825 Репутация автора

Используйте, a.getClassкогда у вас есть экземпляр класса / типа, и вы хотите получить его точный тип. время a.classиспользуется, когда у вас есть typeдоступ и вы хотите создать его экземпляр.
Также getClass()возвращает тип времени выполнения экземпляра, в то время .classкак оценивается во время компиляции.
Учитывая производительность getClass()и .class, .classимеет лучшую производительность, чем getClass() .
Пример :

public class PerfomanceClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        long time=System.nanoTime();
        Class class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();

        System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");     


        long time2=System.nanoTime();
        Class class2=String.class;
        class2=String.class;
        class2=String.class;
        class2=String.class;

        System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns");
    }

}

Выход :

time (getClass()) : 79410 ns
time (.class)     : 8032 ns
Автор: Rohan Размещён: 20.06.2014 07:09

0 плюса

17 Репутация автора

Интересно, что различия в производительности, упомянутые в приведенном выше примере, по-видимому, связаны с другими причинами. При использовании 3 разных классов в среднем производительность будет примерно одинаковой:

import java.util.LinkedHashMap;
public class PerfomanceClass {

public static void main(String[] args) {

    long time = System.nanoTime();
    Class class1 = "String".getClass();
    Class class11 = "Integer".getClass();
    Class class111 = "LinkedHashMap".getClass();

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");

    long time2 = System.nanoTime();
    Class class2 = String.class;
    Class class22 = Integer.class;
    Class class222 = LinkedHashMap.class;

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");
} }

Выход будет что-то вроде:

time (getClass()) :23506 ns 
time (.class):23838 ns

А переключение порядка звонков даже приведет к тому, getClass()что будет быстрее.

import java.util.LinkedHashMap;

public class PerfomanceClass {

public static void main(String[] args) {
    long time2 = System.nanoTime();
    Class class2 = LinkedHashMap.class;

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");

    long time = System.nanoTime();
    Class class1 = "LinkedHashMap".getClass();

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");
}}

Выход:

time (.class):33108 ns
time (getClass()) :6622 ns
Автор: user4287932 Размещён: 24.11.2014 02:37

0 плюса

1 Репутация автора

p.getClass()где pявляется экземпляром объекта, возвращает класс времени выполнения этого объекта p. pне может быть типом, который вызовет ошибку во время компиляции, это должен быть экземпляр объекта.

// B extends A
A a = new B();
System.out.println(a.getClass());
//output: class B

p.classэто выражение. Это .classназывается синтаксис класса. pэто тип. Это может быть имя класса, интерфейса или массива и даже примитивный тип. a.getClass() == B.class,

Если тип доступен и существует экземпляр, то можно использовать getClassметод для получения имени типа. В противном случае используйте .classсинтаксис

Автор: triplestone Размещён: 11.08.2019 07:04
Вопросы из категории :
32x32