// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Java_DevelopersGuide
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki Java_DevelopersGuide
:description: Apache NetBeans wiki Java_DevelopersGuide
:toc: left
:toc-title:
:syntax: true

= Java Infrastructure Developer's guide (AKA Concepts & HowTos)

== Concepts

link:JavaHT_Overview.asciidoc[Overview]

link:JavaHT_JavacPhases.asciidoc[The Javac phases] 

link:JavaHT_TreesElementsTypesTokens.asciidoc[Trees, Elements, Types and Tokens ] 

link:JavaHT_Conversions_TreesElementsTypes.asciidoc[Conversions between trees and elements and types...]

link:JavaHT_IDEIntegration.asciidoc[Integration with the IDE]

link:JavaHT_GettingToJavacInfromation.asciidoc[Getting to the javac information = writting a java infrastructure task]

link:JavaHT_RegisteringRunningTasks.asciidoc[Registering/running tasks]

link:JavaHT_ElementHandle.asciidoc[The ElementHandle]

link:JavaHT_TreePathHandle.asciidoc[The TreePathHandle]

link:JavaHT_ComparingTreesElements.asciidoc[Comparing Trees and Elements]

link:JavaHT_SourceFilesVsClassFiles.asciidoc[Source files vs. Class Files]

link:JavaHT_ClassFilesVsSignatureFiles.asciidoc[Class Files vs. Signature Files]

== How Tos

link:JavaHT_SetupModule.asciidoc[How to setup a module which uses the Java related APIs]

link:JavaHT_GetIntoJavacContext.asciidoc[How do I Get into the Javac Context for a File?]

link:JavaHT_GetAllMembers.asciidoc[How do I Get All Methods/Fields/Constructors of a Class?]

link:JavaHT_Modification.asciidoc[How do I do modification to a source file?]

link:JavaHT_TreeMaker.asciidoc[How to work with TreeMaker]

link:JavaHT_TreeMakerQA.asciidoc[TreeMaker difficulties, Questions &amp; Answers]

link:JavaHT_FindUsagesOfClass.asciidoc[How do I Find All Usages of a Class?]

link:JavaHT_GetElementFromFQN.asciidoc[How do I get an ElementHandle if all I have is the Project and the class name?]

link:JavaHT_GetLibrariesForModule.asciidoc[How do I get a list of libraries/dependencies of a project?]

link:JavaHT_GetSourceLocationOfWrappedJar.asciidoc[How do I get the source location of a wrapped jar?]

link:JavaHT_GetPackagesOfAJar.asciidoc[How do I get the packages contained in a jar/library/dependency?]

== Tutorials

link:http://platform.netbeans.org/tutorials/nbm-copyfqn.html[http://platform.netbeans.org/tutorials/nbm-copyfqn.html]

link:http://platform.netbeans.org/tutorials/nbm-code-generator.html[http://platform.netbeans.org/tutorials/nbm-code-generator.html]

link:http://platform.netbeans.org/tutorials/nbm-java-hint.html[http://platform.netbeans.org/tutorials/nbm-java-hint.html]

link:http://netbeans.org/projects/platform/sources/platform-content/content/trunk/tutorials/60/nbm-whichelement.html?raw=true[http://netbeans.org/projects/platform/sources/platform-content/content/trunk/tutorials/60/nbm-whichelement.html?raw=true]

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/Java[http://wiki.netbeans.org/Java] DevelopersGuide , 
that was last modified by NetBeans user Markiewb 
on 2015-01-29T21:05:26Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
