Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 75

Автор Π‘Ρ€ΡŽΡ ЭккСль

Из Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class загруТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСпосрСдствСнной нСобходимости, Π° статичСская инициализация производится ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ОсобСнно интСрСсно выглядит строка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Class forNameCGum"),

ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ классу Class. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Class Π½ΠΈΡ‡Π΅ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со ссылкой Π½Π° Π½Π΅Π³ΠΎ (ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ поступаСт Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов). Один ΠΈΠ· способов получСния ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° for-Name(), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся строка (String) с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса (слСдитС Π·Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ написания ΠΈ рСгистром символов!). ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class, которая Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Π°; ΠΌΠ΅Ρ‚ΠΎΠ΄ Class.forName() вызывался Ρ€Π°Π΄ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ эффСкта, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ класса Gum, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ Π² памяти. Π’ процСссС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ выполняСтся static-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ класса Gum.

Если Π±Ρ‹ Π² рассмотрСнном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Class.forName() сработал Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ (Π½Π΅ смог Π±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ), ΠΎΠ½ Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΠ» Π±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassNotFoundException. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ просто сообщаСм ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΈ двигаСмся дальшС, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ RTTI Π½Π° стадии исполнСния, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° подходящий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class. Один ΠΈΠ· способов β€” Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Class.forName() β€” ΡƒΠ΄ΠΎΠ±Π΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ потрСбуСтся ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ссли Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ сущСствуСт, для получСния ссылки Π½Π° Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getClass(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ классС Object. ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ фактичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Класс Class содСрТит Π½Π΅ΠΌΠ°Π»ΠΎ интСрСсных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², продСмонстрированных Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

//β€’ typeinfo/ToyTest.java

// ВСстированиС класса Class.

package typeinfo.toys;

import static net.mindview.util Print.*;

interface HasBatteries {} interface Waterproof {} interface Shoots {}

class Toy {

// Π—Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π»Π΅Π΅ конструктор ΠΏΠΎ // ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎΠ³Π΄Π° Π² строкС с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ (*1*) // Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка NoSuchMethodError. Π’ΠΎΡƒΠž {} Toy(int i) {}

}

class FancyToy extends Toy

implements HasBatteries. Waterproof, Shoots { FancyToyО { super(1); }

}

public class ToyTest {

static void printInfo(Class cc) {

print ("Имя класса: " + cc.getNameO +

" это интСрфСйс? [" + cc.isInterfaceO + "]"), print("ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя: " + cc.getSimpleName()); print("ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя- " + cc.getCanonicalName()).

}

public static void main(String[] args) { Class с = null. try {

с = CI ass.forName("typeinfo.toys FancyToy"); } catch(ClassNotFoundException e) {

print("He найдСн класс FancyToy"); System.exit(l);

}

printlnfo(c);

for(Class face : c.getlnterfaces())

printlnfo(face); Class up = c.getSuperclassO; Object obj = null, try {

// НСобходим конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎ = up.newInstanceO; } catchdnstantiationException Π΅) {

printCHe ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚"). System.exit(1); } catchdllegalAccessException Π΅) {

print("НСт доступа"); System.exit(l);

}

printlnfo(obj.getClassO); } ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

} /* Output

Имя класса typeinfo toys FancyToy это интСрфСйс? [false]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя FancyToy

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя- typeinfo.toys FancyToy

Имя класса typeinfo toys HasBatteries это интСрфСйс? [true]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя HasBatteries

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя: typeinfo toys HasBatteries

Имя класса typeinfo toys Waterproof это интСрфСйс? [true]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя. Waterproof

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя typeinfo toys Waterproof

Имя класса, typeinfo.toys Shoots это интСрфСйс? [true]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя: Shoots

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя: typeinfo.toys Shoots

Имя класса: typeinfo.toys Toy это интСрфСйс? [false]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ имя: Toy

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ имя typeinfo.toys.Toy *///.-

Класс FancyToy, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Toy, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСсколько интСрфСйсов: HasBatteries, Waterproof ΠΈ Shoots. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main() создаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class для класса FancyToy, для этого Π² подходящСм Π±Π»ΠΎΠΊΠ΅ try вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ for-Name(). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ (с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°) Π² строкС, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ forName().

ΠœΠ΅Ρ‚ΠΎΠ΄ printInfo() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ getName() для получСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ класса ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getSimpleName() ΠΈ getCanonicalName() (появившиСся Π² Java SE5), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ имя Π±Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя соотвСтствСнно. ΠœΠ΅Ρ‚ΠΎΠ΄ islnterface() провСряСт, прСдставляСт Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class интСрфСйс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Class ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ практичСски всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΈΠΏΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ Class.getlnterfaces() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Class, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… интСрфСйсы, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Class. ΠœΠ΅Ρ‚ΠΎΠ΄ getSuperclass() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ нСпосрСдствСнный (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ блиТайший) Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Class.

ΠœΠ΅Ρ‚ΠΎΠ΄ newlnstance() фактичСски Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Β«Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ конструктор». Π’Ρ‹ ΠΊΠ°ΠΊ Π±Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅: Β«Π― Π½Π΅ знаю ваш Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ создайтС сСбя ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΒ». Π’ рассмотрСнном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ссылка up просто ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class, большС Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ΅ Ρƒ вас Π½Π΅Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ newlnstance() Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ссылку Π½Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Object. Однако получСнная ссылка Π½Π° самом Π΄Π΅Π»Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Toy. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄ посылкой сообщСний, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Ρ… для класса Toy, придСтся провСсти нисходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° newlnstance(), обязан ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ПозднСС Π² этой Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ динамичСски ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Π»ΡŽΠ±Ρ‹ΠΌ конструктором с использованиСм ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° рСфлСксии Java.

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ class

Π’ Java сущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ получСния ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class β€” посрСдством Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° class. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ссылки выглядСло Π±Ρ‹ Ρ‚Π°ΠΊ:

FancyToy.class:

Π’Π°ΠΊΠΎΠΉ способ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Π½ΠΎ Π΅Ρ‰Π΅ ΠΈ бСзопаснСй, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° осущСствляСтся Π΅Ρ‰Π΅ Π²ΠΎ врСмя компиляции. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ½ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° forName(), Π° Π·Π½Π°Ρ‡ΠΈΡ‚, являСтся Π±ΠΎΠ»Π΅Π΅ эффСктивным.

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ class Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со всСми ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ классами, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с интСрфСйсами, массивами ΠΈ Π΄Π°ΠΆΠ΅ с ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ Π²ΠΎ всСх классах-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°Ρ… для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² имССтся ΠΏΠΎΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ TYPE. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ содСрТит ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class для ассоциированного с Π½ΠΈΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π». 13.1.

Π’Π°Π±Π»ΠΈΡ†Π° 13.1. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Class с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ²

Π›ΠΈΡ‚Π΅Ρ€Π°Π»

Бсылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class

boolean.class

Boolean.TYPE

char.class

Character.TYPE

byte.class

Byte.TYPE

short.class

Short.TYPE

int.class

Integer.TYPE

long.class

Long.TYPE

float.class

Float.TYPE

double.class

Double.TYPE

void.class

Void.TYPE

Π₯отя эти вСрсии эквивалСнтны, я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтасис .class, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π»ΡƒΡ‡ΡˆΠ΅ сочСтаСтся с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ классами.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ созданиС ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class с использованиСм записи .class Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ автоматичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Class. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° класса ΠΊ использованию состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… этапов:

β€’ Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° β€” выполняСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ классов. ПослСдний Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈ создаСт Π½Π° Π΅Π³ΠΎ основС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class.

β€’ ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° β€” Π² Ρ„Π°Π·Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ провСряСтся Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ класса, выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ для статичСских ΠΏΠΎΠ»Π΅ΠΉ, ΠΈ ΠΏΡ€ΠΈ нСобходимости Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ всС ссылки Π½Π° классы, созданныС этим классом.

β€’ Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ β€” Ссли Ρƒ класса имССтся супСркласс, происходит Π΅Π³ΠΎ инициализация, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ статичСскиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π±Π»ΠΎΠΊΠΈ статичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ откладываСтся Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ссылки Π½Π° статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ (конструкторы ΡΠ²Π»ΡΡŽΡ‚ΡΡ статичСскими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ) ΠΈΠ»ΠΈ Π½Π° нСконстантноС статичСскоС ΠΏΠΎΠ»Π΅:

//: typeinfo/Class Initialization.java import java util *;

class Initable {

static final int staticFinal = 47; static final int staticFinal2 =

Classlnitialization rand nextlnt(lOOO).

static {

System out Ρ€ΠΏΠΏ^ΠΏΠ‘'Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Initable"), ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

}

}

class Initable2 {

static int staticNonFinal = 147, static {

System out.Ρ€ΠΏΠΏ^ΠΏΠ‘Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Initable2"),

}

}

class Initable3 {

static int staticNonFinal = 74. static {

System ΠΎΠΈ^Ρ€Π³Π¨1ΠΏ("Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Initable3").

}

}

public class Classlnitialization {

public static Random rand = new Random(47), public static void main(String[] args) throws Exception { Class initable = Initable class. System out printin("ПослС создания ссылки Initable"). // He ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ System out println(Initable.staticFinal). // ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-System out printin(Initable staticFinal2); // ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ System out println(Initable2 staticNonFinal). Class initable3 = Class forName("Initable3"). System out printlnC"ПослС создания ссылки Initable3"). System out pri ntin(Initable3 staticNonFinal),

}

} /* Output

ПослС создания ссылки Initable 47

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Initable 258

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ini table2 147

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Initable3 ПослС создания ссылки Ini tablΠ΅Π— 74 *///β€’-

По сути, инициализация откладываСтся Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Из Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ простоС использованиС синтаксиса .class для получСния ссылки Π½Π° класс Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹Π·ΠΎΠ² Class.forNames() Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ класс для получСния ссылки Π½Π° Class, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ initable3.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ссылки

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Class ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания экзСмпляров класса ΠΈ содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этих экзСмпляров. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅ΠΌ содСрТатся статичСскиС Ρ‡Π»Π΅Π½Ρ‹ класса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ссылка Π½Π° Class ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Ρ‚ΠΎΠ³ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ β€” Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Class.

Однако ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Java SE5 Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ уточнСния записи посрСдством ограничСния Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Class, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ссылка; для этой Ρ†Π΅Π»ΠΈ примСняСтся синтаксис ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Ρ€Π½Ρ‹ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° синтаксиса: