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

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

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

Класс Class (ΡƒΠΆΠ΅ описанный Π² этой Π³Π»Π°Π²Π΅) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ рСфлСксии (reflection), для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сущСствуСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° java. lang. reflect, состоящая ΠΈΠ· классов Field, Method ΠΈ Constructor (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Member). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этих классов ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ JVM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ нСизвСстного класса. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Constructor ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get() ΠΈ set() β€” для чтСния ΠΈ записи Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»Π΅ΠΉ класса, прСдставлСнных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Field, ΠΌΠ΅Ρ‚ΠΎΠ΄ invoke() β€” для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, прСдставлСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Method. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ Π² классС Class ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getFields(), getMethods() ΠΈ getConstruc-tors(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ массивы Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΊ поля класса, Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ конструкторы. (Π—Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ описанию класса Class Π² элСктронной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ JDK.) Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, информация ΠΎ нСизвСстном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ становится доступной прямо Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚.

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ рСфлСксии Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΠ²Π΅Ρ€Ρ…ΡŠΠ΅ΡΡ‚Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ³ΠΎ. Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ нСизвСстного Ρ‚ΠΈΠΏΠ°, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина JVM рассматриваСт Π΅Π³ΠΎ ΠΈ Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ классу (это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ RTTI), Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ с Π½ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ„Π°ΠΉΠ» .class для класса этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ доступСн JVM Π»ΠΈΠ±ΠΎ Π² сСти, Π»ΠΈΠ±ΠΎ Π² локальной систСмС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, истинноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ RTTI ΠΈ рСфлСксиСй состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании RTTI Ρ„Π°ΠΉΠ» .class открываСтся ΠΈ анализируСтся компилятором. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΒ» способом. ΠŸΡ€ΠΈ использовании рСфлСксии Ρ„Π°ΠΉΠ» .class Π²ΠΎ врСмя компиляции нСдоступСн; ΠΎΠ½ открываСтся ΠΈ обрабатываСтся систСмой выполнСния.

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… класса

РСфлСксия Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ; ΠΎΠ½Π° сущСствуСт Π² языкС Π² основном для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ JavaBeans. Однако ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… динамичСская информация ΠΎ классС просто Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠ°.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ Π½Π° экран список ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса. ΠŸΡ€ΠΈ просмотрС исходного ΠΊΠΎΠ΄Π° класса ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ классС. Но Π² классС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ мноТСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², доступных ΠΈΠ· Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π˜ΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ… ΠΈ слоТно, ΠΈ Π΄ΠΎΠ»Π³ΠΎ21. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, рСфлСксия позволяСт Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ простой инструмСнт, выводящий ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌ интСрфСйсС класса. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

//: typeinfo/ShowMethods.java

// ИспользованиС рСфлСксии для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ списка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

// класс, Π² Ρ‚ΠΎΠΌ числС ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС.

// {Args: ShowMethods}

import java.lang.reflect.*;

import java.util.regex.*;

import static net.mindview.util.Print.*;

public class ShowMethods {

private static String usage = "usage:\n" +

"ShowMethods qualified.class.name\n" + "To show all methods in class or:\n" + "ShowMethods qualified.class.name word\n" + "To search for methods involving 'word'"; private static Pattern p = Pattern.compile("\\w+\\."); public static void main(String[] args) { if(args.length < 1) { print(usage);

System exit(O);

}

int lines = 0; try {

Class<?> с = Class.forName(args[0]); Method[] methods = c.getMethods(); Constructor[] ctors = c.getConstructorsO; if(args.length == 1) {

for(Method method . methods) print(

p.matcher(method.toStri ng()).replaceAl

1Π‘"));

for(Constructor ctor β€’ ctors)

pri nt(p.matcher(ctor.toStri ng()).replaceAl1("")

);

lines = methods.length + ctors.length,

} else {

for(Method method : methods)

if (method. toStringO. indexOf(args[l]) != -1) { print(

p.matcher(method.toStri ng О)

replaceAll (""));

lines++;

}

for(Constructor ctor : ctors)

if(ctor.toStringO.indexOf(args[l]) != -1) { print(p.matcher(

ctor.toStri ng О).replaceAl 1 ("

lines++;

}

}

} catch(ClassNotFoundException e) {

print("No such class: " + e):

}

}

} /* Output:

public static void main(String[]) public native int hashCodeO public final native Class getClassO

public final void wait(long.int) throws InterruptedException public final void waitO throws InterruptedException public final native void wait(long) throws InterruptedException public boolean equals(Object) public String toStringO public final native void notifyО public final native void notifyAllO public ShowMethodsO *///:-

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Class getMethods() ΠΈ getConstructors() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ массивы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Method ΠΈ Constructor, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ конструкторы класса. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· этих классов Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для получСния ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠΌΠ΅Π½, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ прСдставляСмых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ простой ΠΌΠ΅Ρ‚ΠΎΠ΄ toString(), ΠΊΠ°ΠΊ ΠΈ сдСлано здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строку с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку ΠΈ опрСдСляСт, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ для поиска (с использованиСм indexOf()), Π° послС выдСляСт описатСли ΠΈΠΌΠ΅Π½ классов.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Class.forName(), Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ извСстСн Π²ΠΎ врСмя компиляции, поэтому вся информация ΠΎ сигнатурС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² становится доступной Π²ΠΎ врСмя выполнСния. Если Π²Ρ‹ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ рСфлСксии ΠΈΠ· JDK, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ рСфлСксия позволяСт ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Β«Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСизвСстного» Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹). Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, Π²Π°ΠΌ эти возмоТности Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ понадобятся, Π½ΠΎ сам Ρ„Π°ΠΊΡ‚ ΠΈΡ… сущСствования интСрСсСн.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

java ShowMethods ShowMethods

На экран выводится ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ (public) конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, хотя Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΎΠΉ конструктор Π½Π΅ опрСдСляСтся. Π’ΠΎΡ‚ конструктор, Ρ‡Ρ‚ΠΎ имССтся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² классС, автоматичСски сгСнСрирован компилятором. Если Π²Ρ‹ послС этого сдСлаСтС класс ShowMethods Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΈΠ· Π΅Π³ΠΎ опрСдСлСния спСцификатор доступа public, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ прСдоставитС Π΅ΠΌΡƒ доступ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°), сгСнСрированный компилятором конструктор исчСзнСт ΠΈΠ· списка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ доступа, Ρ‡Ρ‚ΠΎ ΠΈ Π΅Π³ΠΎ класс.

Π’Π°ΠΊΠΆΠ΅ интСрСсно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π²ΠΈΠ΄Π΅

java ShowMethods java lang String

с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° char, int, String ΠΈ Ρ‚. ΠΏ.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сэкономит Π²Π°ΠΌ Π½Π΅ΠΌΠ°Π»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΌΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ этого класса ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Ссли Π²Π°ΠΌ потрСбуСтся ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π»ΠΈ Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Color, ΠΈ Ρ‚. Π΄.

ДинамичСскиС посрСдники

Β«ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊΒ» (proxy) ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ числу основных ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² проСктирования. Он прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подставляСтся Π½Π° мСсто «настоящСго» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ структуру посрСдника:

//. typeinfo/SimpleProxyDemo java import static net mindview.util Print *,

interface Interface { void doSomethingO; void somethingElse(String arg).

}

class Real Object implements Interface {

public void doSomethingO { printC'doSomething"); } public void somethingElse(String arg) { printC'somethingElse " + arg),

}

}

class SimpleProxy implements Interface { private Interface proxied, public SimpleProxy(Interface proxied) { this.proxied = proxied,

}

public void doSomethingO {

print("SimpleProxy doSomething"), proxied doSomethingO,

}

public void somethingElse(String arg) {

print("SimpleProxy somethingElse " + arg); proxied.somethingElse(arg);

}

class SimpleProxyDemo {

public static void consumer^Interface iface) { iface doSomethingO; iface somethingElseC'bonobo");

}

public static void main(String[] args) { consumer(new RealObjectO), consumer(new SimpleProxy(new RealObjectO)),

}

} /* Output doSomething somethingElse bonobo SimpleProxy doSomething doSomething

SimpleProxy somethingElse bonobo

somethingElse bonobo */// ~

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ consumer() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Interface, ΠΎΠ½ Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ пСрСдаСтся β€” «настоящий» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (RealObject) ΠΈΠ»ΠΈ посрСдник (Proxy), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Interface. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Proxy, находящийся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ «настоящим» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ RealObject.

ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ пригодится Π² любой ситуации, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ «настоящСго» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ особСнно ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° использования Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ Π½ΠΈΡ… (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ β€” Π³Π»Π°Π²Π½ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² являСтся инкапсуляция ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, поэтому для оправдания ΠΈΡ… примСнСния Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ). Допустим, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² RealObject, ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° эти Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΈ Ρ‚. Π΄. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° посрСдник ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

ДинамичСскиС посрСдники Java Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ посрСдника β€” ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ посрСдника создаСтся динамичСски, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² опосрСдованных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚ΠΎΠΆΠ΅ осущСствляСтся динамичСски. ВсС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΊ динамичСскому посрСднику, ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, Ρ‡Ρ‚ΠΎ это Π·Π° Π²Ρ‹Π·ΠΎΠ² ΠΈ ΠΊΠ°ΠΊ с Π½ΠΈΠΌ слСдуСт ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€ SimpleProxyDemo.java, пСрСписанный для динамичСского посрСдника:

// typeinfo/SimpleDynamicProxy java import java lang.reflect *.

class DynamicProxyHandler implements InvocationHandler { private Object proxied; public DynamicProxyHandler(Object proxied) { this proxied = proxied,

}

public Object

invoke(Object proxy, Method method, Object[] args) throws Throwable {

System out.printlnC'**** proxy. " + proxy.getClass() +

method- " + method + ", args " + args); if(args != nul 1) ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

for(Object arg : args)

System.out.println(" " + arg); return method.invoke(proxied, args);

}

}

class SimpleDynamicProxy {

public static void consumer(Interface iface) { iface.doSomething(); i face.somethi ngElse("bonobo");

}

public static void main(String[] args) {

Real Object real = new Real ObjectО; consumer(real);

// ВставляСм посрСдника ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ снова: Interface proxy = (Interface)Proxy.newProxyInstance( Interface.class.getClassLoader(), new Class[]{ Interface.class }. new DynamicProxyHandler(real)); consumer(proxy);