Java бастапқы кодын CharSequence нысандарына құрастыру

Новости мира

Бұл бөлімде сіз javax.tools.JavaCompiler сыныбы үшін қасбет жасайсыз. javaxtools.compiler.CharSequenceCompiler сыныбы (Жүктеу бөлімін қараңыз) Class түріндегі нысанды қайтару арқылы Java бастапқы кодын кез келген java.lang.CharSequence нысандарына (мысалы, String, StringBuffer және StringBuilder) құрастыра алады. CharSequenceCompiler сыныбында келесі API бар:
public CharSequenceCompiler(ClassLoader жүктеушісі, қайталанатын опциялар): Бұл конструктор Java компиляторына жіберілетін ClassLoader түріндегі нысанды алады және оған тәуелді сыныптарды табуға мүмкіндік береді. Итеративті тип параметрі клиентке javac компилятор опцияларына сәйкес келетін қосымша компилятор опцияларын өткізуге мүмкіндік береді.

public Map> compile(Map сыныптары, соңғы DiagnosticCollector диагностикасы) CharSequenceCompilerException, ClassCastException шығарады: Бұл бірнеше бастапқы код элементтерін бір уақытта құрастыруға қолдау көрсететін компиляцияның стандартты әдісі. Айта кету керек, Java компиляторы сыныптардан циклдік графиктерді қолдауы керек, мысалы, A.java B.java, B.java C.java, ал C.java A.java-ға тәуелді болғанда. Бұл әдістің бірінші аргументі Map нысаны болып табылады, оның кілттері толық жарамды сынып атаулары және олардың сәйкес мәндері сыныптың бастапқы кодын қамтитын CharSequences нысандары болып табылады. Мысалы:
«mypackage.A» «mypackage пакеті; жалпы класс A {… }»;
«mypackage.B» «mypackage пакеті; B класы кеңейтеді A қондырғылары C { … }»;
«mypackage.C» «mypackage пакеті; C интерфейсі {…}»
Компилятор DiagnosticCollector-қа Диагностика нысандарын қосады. Түр параметрі T класс түрлендірілетін жалпы тип болып табылады. compile() әдісі компиляциялау үшін бір сынып атауын және CharSequence нысанын алатын басқа әдіспен шамадан тыс жүктеледі.

public ClassLoader getClassLoader(): Бұл әдіс .class файлдарын жасау кезінде компилятор жасаған сынып жүктеушісін қайтарады, осылайша одан басқа сыныптар немесе ресурстар жүктелуі мүмкін.

public Class loadClass(final String qualifiedClassName) ClassNotFoundException шығарады: compile() әдісі кірістірілген жалпы сыныптарды қоса бірнеше сыныптарды анықтай алатындықтан, бұл әдіс осы көмекші сыныптарды жүктеуге мүмкіндік береді.

CharSequenceCompiler API қолдау көрсету үшін JavaFileObjectImpl (бастапқы коды бар CharSequence нысандарын сақтау және компилятор шығарған CLASS нысандарын шығару үшін) және JavaFileManagerImpl (көзі және JavaFileObjectImpl даналарын басқару үшін атауларды байланыстыратын) сыныптарымен javax.tools бумасының интерфейстерін іске асырамын. компилятор арқылы жасалған байт-код тізбегі).

JavaFileObjectImpl

1-тізімде көрсетілген JavaFileObjectImpl сыныбы JavaFileObject интерфейсін жүзеге асырады және бастапқы кодты CharSequence нысанында (SOURCE нысандары) немесе ByteArrayOutputStream нысанында (CLASS файлдары) байт кодты сақтайды. Негізгі әдіс CharSequence getCharContent(соңғы логикалық ignoreEncodingErrors), ол арқылы компилятор бастапқы код мәтінін алады. Барлық мысалдардың толық бастапқы коды Жүктеулер бөлімінде қолжетімді.

Листинг 1. JavaFileObjectImpl сыныбы (бастапқы үзінді)
соңғы сынып JavaFileObjectImpl SimpleJavaFileObject кеңейтеді {
жеке соңғы CharSequence көзі;

JavaFileObjectImpl(соңғы жолдың негізгі атауы, соңғы CharSequence көзі) {
super(CharSequenceCompiler.toURI(baseName + «.java»), Kind.SOURCE);
this.source = көз;
}
@Override
public CharSequence getCharContent(соңғы логикалық ignoreEncodingErrors)
UnsupportedOperationException шығарады {
егер (көзі == нөл)
жаңа UnsupportedOperationException шығарыңыз («getCharContent()»);
қайтару көзі;
}
}

FileManagerImpl

FileManagerImpl сыныбы (2-тізімді қараңыз) толық жарамды сынып атауларын JavaFileObjectImpl нысандарымен байланыстыру үшін ForwardingJavaFileManager сыныбын кеңейтеді: