Π‘Π°ΠΊΠ°Π»Π°Π²Ρ€
Π”ΠΈΠΏΠ»ΠΎΠΌΠ½Ρ‹Π΅ ΠΈ курсовыС Π½Π° Π·Π°ΠΊΠ°Π·

ГСнСрация классов, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсы ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Java Compiler API Π±Ρ‹Π»ΠΎ прСдставлСно Π² Java с Π²Π΅Ρ€ΡΠΈΠΈ 1.6. Оно позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ компилятор Java. Помимо этого Java Compiler API позволяСт ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π΅ΠΌ самым контролируя процСсс компиляции ΠΈ ΠΎΡ‚слСТивая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки. НиТС слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€ получСния компилятора, доступного Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ ΠΈ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для компиляции Ρ„Π°ΠΉΠ»Π° «MyClass.java». По String sourceFileName = «src… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ГСнСрация классов, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсы ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Как Π±Ρ‹Π»ΠΎ упомянуто Ρ€Π°Π½Π΅Π΅, для связывания Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ ΡΡ€Π°Π±Π°Ρ‚ывания события ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² BeanBox ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ гСнСрация исходного ΠΊΠΎΠ΄Π° с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ компиляциСй этого ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° стандартного java компилятора ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ скомпилированных классов Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся кроссплатформСнным ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ошибкам. Π’ ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… вСрсиях JDK сущСствуСт нСсколько инструмСнтов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Ρ†Π΅Π»ΠΈ: Dynamic Proxy Class API ΠΈ Java Compiler API. Помимо этого, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ java Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Apache Byte Code Engineering Library [2].

Java Compiler API Π±Ρ‹Π»ΠΎ прСдставлСно Π² Java с Π²Π΅Ρ€ΡΠΈΠΈ 1.6. Оно позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ компилятор Java [9]. Помимо этого Java Compiler API позволяСт ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π΅ΠΌ самым контролируя процСсс компиляции ΠΈ ΠΎΡ‚слСТивая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки. НиТС слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€ получСния компилятора, доступного Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ ΠΈ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для компиляции Ρ„Π°ΠΉΠ»Π° «MyClass.java».

По String sourceFileName = «src» + File. pathSeparator + «MyClass.java» ;

JavaCompiler compiler = ToolProvider. getSystemJavaCompiler ();

int res = compiler. run (null, null, null, sourceFileName);

Π΄Ρ…ΠΎΠ΄ ΠΊ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Java Compiler API ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΌΡƒ Π² BeanBox, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исходного java ΠΊΠΎΠ΄Π° ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ скомпилированных классов, ΠΎΠ΄Π½Π°ΠΊΠΎ позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ошибкам Π²Ρ‹Π·ΠΎΠ²Π° java компилятора Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданном процСссС ΠΈ Π½Π΅ΠΎΠ±Ρ…одимости пСрСкомпиляции прилоТСния ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρƒ. Однако, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны Π΄Π°Π»Π΅Π΅, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ java компилятора Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ (ΠΏΡ€ΠΈ этом java компилятор Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΎΡΡ‚Π°Π² JDK, Π½ΠΎ Π½Π΅ JRE).

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² — гСнСрация java Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π±Π΅Π· создания исходного ΠΊΠΎΠ΄Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ компилятора. Π‘Π°ΠΌΠΎΠΉ распространСнной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ для Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ являСтся Apache Byte Code Engineering Library [2]. Она позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ java класс Ρ„Π°ΠΉΠ»Ρ‹ (Ρ„Π°ΠΉΠ»Ρ‹, содСрТащиС Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄) ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΈ. И Ρ…ΠΎΡ‚Ρ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для связывания ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² являСтся довольно малСньким ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ, использованиС Ρ‚Π°ΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ знания java Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ class Ρ„Π°ΠΉΠ»ΠΎΠ². НапримСр, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ пустому классу:

MethodGen mg = new MethodGen (ACC_STATIC | ACC_PUBLIC, // access flags.

Type.VOID, // return type.

new Type[] { // argument types.

new ArrayType (Type.STRING, 1) },.

new String[] { «argv» }, // arg names.

" main", «HelloWorld», // method, class.

il, cp);

InstructionFactory factory = new InstructionFactory (cg);

Java Dynamic Proxy Class API появилось Π² Java, начиная с Π²Π΅Ρ€ΡΠΈΠΈ 1.3. Оно позволяСт динамичСски ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прокси классы, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ исполнСния список интСрфСйсов, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρƒ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ½Ρ‚СрфСйсов, этот Π²Ρ‹Π·ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ — ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ [7]. Java Dynamic Proxy Class API позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· использования Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, java компилятор ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°, ΠΈ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, вмСсто этого, созданиС прокси классов производится Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ Java Virtual Machine (JVM). Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ выглядит Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ инструмСнта. ИспользованиС Java Dynamic Proxy API Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСно Π΄Π°Π»Π΅Π΅ Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ