Merge branch 'master' into release
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index f90af52..03a18bb 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -32,4 +32,4 @@
       with:
         java-version: ${{ matrix.java }}
     - name: Build with Maven
-      run: mvn -V package --file pom.xml
+      run: mvn -V apache-rat:check package --file pom.xml
diff --git a/LICENSE.txt b/LICENSE.txt
index 1c572e3..d645695 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,204 +1,202 @@
-/*
- *                                 Apache License
- *                           Version 2.0, January 2004
- *                        http://www.apache.org/licenses/
- *
- *   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- *
- *   1. Definitions.
- *
- *      "License" shall mean the terms and conditions for use, reproduction,
- *      and distribution as defined by Sections 1 through 9 of this document.
- *
- *      "Licensor" shall mean the copyright owner or entity authorized by
- *      the copyright owner that is granting the License.
- *
- *      "Legal Entity" shall mean the union of the acting entity and all
- *      other entities that control, are controlled by, or are under common
- *      control with that entity. For the purposes of this definition,
- *      "control" means (i) the power, direct or indirect, to cause the
- *      direction or management of such entity, whether by contract or
- *      otherwise, or (ii) ownership of fifty percent (50%) or more of the
- *      outstanding shares, or (iii) beneficial ownership of such entity.
- *
- *      "You" (or "Your") shall mean an individual or Legal Entity
- *      exercising permissions granted by this License.
- *
- *      "Source" form shall mean the preferred form for making modifications,
- *      including but not limited to software source code, documentation
- *      source, and configuration files.
- *
- *      "Object" form shall mean any form resulting from mechanical
- *      transformation or translation of a Source form, including but
- *      not limited to compiled object code, generated documentation,
- *      and conversions to other media types.
- *
- *      "Work" shall mean the work of authorship, whether in Source or
- *      Object form, made available under the License, as indicated by a
- *      copyright notice that is included in or attached to the work
- *      (an example is provided in the Appendix below).
- *
- *      "Derivative Works" shall mean any work, whether in Source or Object
- *      form, that is based on (or derived from) the Work and for which the
- *      editorial revisions, annotations, elaborations, or other modifications
- *      represent, as a whole, an original work of authorship. For the purposes
- *      of this License, Derivative Works shall not include works that remain
- *      separable from, or merely link (or bind by name) to the interfaces of,
- *      the Work and Derivative Works thereof.
- *
- *      "Contribution" shall mean any work of authorship, including
- *      the original version of the Work and any modifications or additions
- *      to that Work or Derivative Works thereof, that is intentionally
- *      submitted to Licensor for inclusion in the Work by the copyright owner
- *      or by an individual or Legal Entity authorized to submit on behalf of
- *      the copyright owner. For the purposes of this definition, "submitted"
- *      means any form of electronic, verbal, or written communication sent
- *      to the Licensor or its representatives, including but not limited to
- *      communication on electronic mailing lists, source code control systems,
- *      and issue tracking systems that are managed by, or on behalf of, the
- *      Licensor for the purpose of discussing and improving the Work, but
- *      excluding communication that is conspicuously marked or otherwise
- *      designated in writing by the copyright owner as "Not a Contribution."
- *
- *      "Contributor" shall mean Licensor and any individual or Legal Entity
- *      on behalf of whom a Contribution has been received by Licensor and
- *      subsequently incorporated within the Work.
- *
- *   2. Grant of Copyright License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      copyright license to reproduce, prepare Derivative Works of,
- *      publicly display, publicly perform, sublicense, and distribute the
- *      Work and such Derivative Works in Source or Object form.
- *
- *   3. Grant of Patent License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      (except as stated in this section) patent license to make, have made,
- *      use, offer to sell, sell, import, and otherwise transfer the Work,
- *      where such license applies only to those patent claims licensable
- *      by such Contributor that are necessarily infringed by their
- *      Contribution(s) alone or by combination of their Contribution(s)
- *      with the Work to which such Contribution(s) was submitted. If You
- *      institute patent litigation against any entity (including a
- *      cross-claim or counterclaim in a lawsuit) alleging that the Work
- *      or a Contribution incorporated within the Work constitutes direct
- *      or contributory patent infringement, then any patent licenses
- *      granted to You under this License for that Work shall terminate
- *      as of the date such litigation is filed.
- *
- *   4. Redistribution. You may reproduce and distribute copies of the
- *      Work or Derivative Works thereof in any medium, with or without
- *      modifications, and in Source or Object form, provided that You
- *      meet the following conditions:
- *
- *      (a) You must give any other recipients of the Work or
- *          Derivative Works a copy of this License; and
- *
- *      (b) You must cause any modified files to carry prominent notices
- *          stating that You changed the files; and
- *
- *      (c) You must retain, in the Source form of any Derivative Works
- *          that You distribute, all copyright, patent, trademark, and
- *          attribution notices from the Source form of the Work,
- *          excluding those notices that do not pertain to any part of
- *          the Derivative Works; and
- *
- *      (d) If the Work includes a "NOTICE" text file as part of its
- *          distribution, then any Derivative Works that You distribute must
- *          include a readable copy of the attribution notices contained
- *          within such NOTICE file, excluding those notices that do not
- *          pertain to any part of the Derivative Works, in at least one
- *          of the following places: within a NOTICE text file distributed
- *          as part of the Derivative Works; within the Source form or
- *          documentation, if provided along with the Derivative Works; or,
- *          within a display generated by the Derivative Works, if and
- *          wherever such third-party notices normally appear. The contents
- *          of the NOTICE file are for informational purposes only and
- *          do not modify the License. You may add Your own attribution
- *          notices within Derivative Works that You distribute, alongside
- *          or as an addendum to the NOTICE text from the Work, provided
- *          that such additional attribution notices cannot be construed
- *          as modifying the License.
- *
- *      You may add Your own copyright statement to Your modifications and
- *      may provide additional or different license terms and conditions
- *      for use, reproduction, or distribution of Your modifications, or
- *      for any such Derivative Works as a whole, provided Your use,
- *      reproduction, and distribution of the Work otherwise complies with
- *      the conditions stated in this License.
- *
- *   5. Submission of Contributions. Unless You explicitly state otherwise,
- *      any Contribution intentionally submitted for inclusion in the Work
- *      by You to the Licensor shall be under the terms and conditions of
- *      this License, without any additional terms or conditions.
- *      Notwithstanding the above, nothing herein shall supersede or modify
- *      the terms of any separate license agreement you may have executed
- *      with Licensor regarding such Contributions.
- *
- *   6. Trademarks. This License does not grant permission to use the trade
- *      names, trademarks, service marks, or product names of the Licensor,
- *      except as required for reasonable and customary use in describing the
- *      origin of the Work and reproducing the content of the NOTICE file.
- *
- *   7. Disclaimer of Warranty. Unless required by applicable law or
- *      agreed to in writing, Licensor provides the Work (and each
- *      Contributor provides its Contributions) on an "AS IS" BASIS,
- *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- *      implied, including, without limitation, any warranties or conditions
- *      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- *      PARTICULAR PURPOSE. You are solely responsible for determining the
- *      appropriateness of using or redistributing the Work and assume any
- *      risks associated with Your exercise of permissions under this License.
- *
- *   8. Limitation of Liability. In no event and under no legal theory,
- *      whether in tort (including negligence), contract, or otherwise,
- *      unless required by applicable law (such as deliberate and grossly
- *      negligent acts) or agreed to in writing, shall any Contributor be
- *      liable to You for damages, including any direct, indirect, special,
- *      incidental, or consequential damages of any character arising as a
- *      result of this License or out of the use or inability to use the
- *      Work (including but not limited to damages for loss of goodwill,
- *      work stoppage, computer failure or malfunction, or any and all
- *      other commercial damages or losses), even if such Contributor
- *      has been advised of the possibility of such damages.
- *
- *   9. Accepting Warranty or Additional Liability. While redistributing
- *      the Work or Derivative Works thereof, You may choose to offer,
- *      and charge a fee for, acceptance of support, warranty, indemnity,
- *      or other liability obligations and/or rights consistent with this
- *      License. However, in accepting such obligations, You may act only
- *      on Your own behalf and on Your sole responsibility, not on behalf
- *      of any other Contributor, and only if You agree to indemnify,
- *      defend, and hold each Contributor harmless for any liability
- *      incurred by, or claims asserted against, such Contributor by reason
- *      of your accepting any such warranty or additional liability.
- *
- *   END OF TERMS AND CONDITIONS
- *
- *   APPENDIX: How to apply the Apache License to your work.
- *
- *      To apply the Apache License to your work, attach the following
- *      boilerplate notice, with the fields enclosed by brackets "[]"
- *      replaced with your own identifying information. (Don't include
- *      the brackets!)  The text should be enclosed in the appropriate
- *      comment syntax for the file format. We also recommend that a
- *      file or class name and description of purpose be included on the
- *      same "printed page" as the copyright notice for easier
- *      identification within third-party archives.
- *
- *   Copyright [yyyy] [name of copyright owner]
- *
- *   Licensed 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.
- */
 
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index dfbf4f6..c46205b 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,23 +1,24 @@
               Apache Commons BCEL
-              Version 6.4.0-SNAPSHOT
+              Version 6.4.0
               RELEASE NOTES
 
 
 INTRODUCTION:
 
 The Apache Commons BCEL team is pleased to announce the release of
-Apache Commons BCEL 6.4.0-SNAPSHOT!
+Apache Commons BCEL 6.4.0!
 
 The Byte Code Engineering Library (BCEL) is intended to give users a convenient
 way to analyze, create, and manipulate compiled .class files. Classes are
 represented by objects containing all the symbolic information of the given
 class: methods, fields and byte code instructions.
 
-Bug fix release
+Feature and bug fix release.
 
 NEW FEATURES:
 =============
 
+o BCEL-318: Add method org.apache.bcel.classfile.ConstantUtf8.clearCache(). Thanks to Gary Gregory.
 o BCEL-320: Add LruCacheClassPathRepository that can scan many JAR files without OutOfMemoryError. Thanks to Tomo Suzuki, Gary Gregory.
 o BCEL-322: Add constants to org.apache.bcel.Const for Java 14. Thanks to Gary Gregory.
 o BCEL-321: Refactor subclasses of ClassPathRepository for differences in underlying cache. Thanks to Tomo Suzuki.
@@ -27,7 +28,6 @@
 
 o BCEL-316: org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default. Thanks to Gary Gregory.
 o BCEL-278: InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11. Thanks to Valery Barysoky.
-o BCEL-318: Add org.apache.bcel.classfile.ConstantUtf8.clearCache(). Thanks to Gary Gregory.
 o BCEL-270: Calling toString(ConstantPool) on InvokeInstruction throws NullPointerException. Thanks to Alexandru-Constantin Bledea.
 o BCEL-323: org.apache.bcel.util.BCELifier to set major and minor versions. Thanks to Tomo Suzuki.
 o BCEL-326: Add missing Java 9 and Java 11 class file attributes. #33 Thanks to Mark Roberts.
@@ -50,7 +50,7 @@
 
 https://commons.apache.org/proper/commons-bcel
 
-Download it from https://commons.apache.org/proper/commons-bcel/download_text.cgi
+Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi
 
 Have fun!
 -Apache Commons BCEL team
@@ -72,6 +72,7 @@
 
 -----------------------------------------------------------------------------
 
+
               Apache Commons BCEL
               Version 6.3.1
               RELEASE NOTES
diff --git a/pom.xml b/pom.xml
index 25ef8e7..e400020 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
   <parent>

     <groupId>org.apache.commons</groupId>

     <artifactId>commons-parent</artifactId>

-    <version>48</version>

+    <version>49</version>

   </parent>

 

   <groupId>org.apache.bcel</groupId>

@@ -49,7 +49,7 @@
     <commons.module.name>org.apache.bcel</commons.module.name>

     <commons.release.version>6.4.0</commons.release.version>

     <commons.release.isDistModule>true</commons.release.isDistModule>

-    <commons.rc.version>RC1</commons.rc.version>

+    <commons.rc.version>RC2</commons.rc.version>

     <commons.bc.version>6.3.1</commons.bc.version>

     <commons.release.desc>(Java 8)</commons.release.desc>

     <commons.scmPubUrl>https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel</commons.scmPubUrl>

@@ -213,6 +213,7 @@
   </scm>

 

   <build>

+    <defaultGoal>clean verify apache-rat:check japicmp:cmp checkstyle:check javadoc:javadoc</defaultGoal>

     <plugins>

       <plugin>

         <groupId>org.apache.rat</groupId>

@@ -348,6 +349,15 @@
           </parameter>

         </configuration>

       </plugin>    

+      <plugin>

+        <groupId>com.github.spotbugs</groupId>

+        <artifactId>spotbugs-maven-plugin</artifactId>

+        <version>${commons.spotbugs.version}</version>

+        <configuration>

+          <threshold>Normal</threshold>

+          <effort>Default</effort>

+        </configuration>

+      </plugin>

     </plugins>

   </build>

 

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 78de4f5..895ab3b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -62,10 +62,10 @@
    -->

 

   <body>

-    <release version="6.4.0" date="2019-09-08" description="Bug fix release">

+    <release version="6.4.0" date="2019-09-20" description="Feature and bug fix release.">

       <action issue="BCEL-316" type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default.</action>

       <action issue="BCEL-278" type="fix" dev="ggregory" due-to="Valery Barysoky">InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11.</action>

-      <action issue="BCEL-318" type="fix" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.classfile.ConstantUtf8.clearCache().</action>

+      <action issue="BCEL-318" type="add" dev="ggregory" due-to="Gary Gregory">Add method org.apache.bcel.classfile.ConstantUtf8.clearCache().</action>

       <action issue="BCEL-317" type="update" dev="ggregory" due-to="Tomo Suzuki, Gary Gregory">Pluggable cache for ConstantUtf8.</action>

       <action issue="BCEL-320" type="add" dev="ggregory" due-to="Tomo Suzuki, Gary Gregory">Add LruCacheClassPathRepository that can scan many JAR files without OutOfMemoryError.</action>

       <action issue="BCEL-299" type="update" dev="ggregory" due-to="Gary Gregory, zhangminglei">Fix example src/examples/ClassDumper.java ClassDumper.processID().</action>

diff --git a/src/changes/release-notes.vm b/src/changes/release-notes.vm
index 7677a06..d0d6abc 100644
--- a/src/changes/release-notes.vm
+++ b/src/changes/release-notes.vm
@@ -136,7 +136,7 @@
 
 ${project.url}
 
-Download it from ${project.url}/download_text.cgi
+Download it from ${project.url}/download_bcel.cgi
 
 Have fun!
 -Apache Commons BCEL team
@@ -155,3 +155,6 @@
 Or subscribe to the commons-user mailing list
 
 The Apache Commons Team
+
+-----------------------------------------------------------------------------
+
diff --git a/src/examples/ClassDumper.java b/src/examples/ClassDumper.java
index a223672..0c4a18b 100644
--- a/src/examples/ClassDumper.java
+++ b/src/examples/ClassDumper.java
@@ -31,7 +31,7 @@
 import org.apache.bcel.classfile.Method;
 import org.apache.bcel.util.BCELifier;
 
-/** 
+/**
  * Display Java .class file data.
  * Output is based on javap tool.
  * Built using the BCEL libary.
@@ -115,10 +115,10 @@
         if (magic != Const.JVM_CLASSFILE_MAGIC) {
             throw new ClassFormatException(file_name + " is not a Java .class file");
         }
-        System.out.println("Java Class Dump"); 
-        System.out.println("  file: " + file_name); 
-        System.out.printf("%nClass header:%n"); 
-        System.out.printf("  magic: %X%n", magic); 
+        System.out.println("Java Class Dump");
+        System.out.println("  file: " + file_name);
+        System.out.printf("%nClass header:%n");
+        System.out.printf("  magic: %X%n", magic);
     }
 
     /**
@@ -128,10 +128,10 @@
      */
     private final void processVersion () throws IOException, ClassFormatException {
         minor = file.readUnsignedShort();
-        System.out.printf("  minor version: %s%n", minor); 
+        System.out.printf("  minor version: %s%n", minor);
 
         major = file.readUnsignedShort();
-        System.out.printf("  major version: %s%n", major); 
+        System.out.printf("  major version: %s%n", major);
     }
 
     /**
@@ -146,19 +146,19 @@
         constant_pool = new ConstantPool(constant_items);
 
         // constant_pool[0] is unused by the compiler
-        System.out.printf("%nConstant pool(%d):%n", constant_pool_count - 1); 
+        System.out.printf("%nConstant pool(%d):%n", constant_pool_count - 1);
 
         for (int i = 1; i < constant_pool_count; i++) {
             constant_items[i] = Constant.readConstant(file);
             // i'm sure there is a better way to do this
             if (i < 10) {
-                System.out.printf("    #%1d = ", i); 
+                System.out.printf("    #%1d = ", i);
             } else if (i <100) {
-                System.out.printf("   #%2d = ", i); 
+                System.out.printf("   #%2d = ", i);
             } else {
-                System.out.printf("  #%d = ", i); 
-            }    
-            System.out.println(constant_items[i]); 
+                System.out.printf("  #%d = ", i);
+            }
+            System.out.println(constant_items[i]);
 
             // All eight byte constants take up two spots in the constant pool
             tag = constant_items[i].getTag();
@@ -188,15 +188,15 @@
                     " can't be both final and abstract");
         }
 
-        System.out.printf("%nClass info:%n"); 
+        System.out.printf("%nClass info:%n");
         System.out.println("  flags: " + BCELifier.printFlags(access_flags,
                 BCELifier.FLAGS.CLASS));
         class_name_index = file.readUnsignedShort();
-        System.out.printf("  this_class: %d (", class_name_index); 
-        System.out.println(constantToString(class_name_index) + ")"); 
+        System.out.printf("  this_class: %d (", class_name_index);
+        System.out.println(constantToString(class_name_index) + ")");
 
         superclass_name_index = file.readUnsignedShort();
-        System.out.printf("  super_class: %d (", superclass_name_index); 
+        System.out.printf("  super_class: %d (", superclass_name_index);
         if (superclass_name_index > 0) {
             System.out.printf("%s", constantToString(superclass_name_index));
         }
@@ -213,17 +213,17 @@
         interfaces_count = file.readUnsignedShort();
         interfaces = new int[interfaces_count];
 
-        System.out.printf("%nInterfaces(%d):%n", interfaces_count); 
+        System.out.printf("%nInterfaces(%d):%n", interfaces_count);
 
         for (int i = 0; i < interfaces_count; i++) {
             interfaces[i] = file.readUnsignedShort();
             // i'm sure there is a better way to do this
             if (i < 10) {
-                System.out.printf("   #%1d = ", i); 
+                System.out.printf("   #%1d = ", i);
             } else if (i <100) {
-                System.out.printf("  #%2d = ", i); 
+                System.out.printf("  #%2d = ", i);
             } else {
-                System.out.printf(" #%d = ", i); 
+                System.out.printf(" #%d = ", i);
             }
             System.out.println(interfaces[i] + " (" +
                     constant_pool.getConstantString(interfaces[i],
@@ -241,13 +241,13 @@
         fields_count = file.readUnsignedShort();
         fields = new Field[fields_count];
 
-        // sometimes fields[0] is magic used for serialization 
-        System.out.printf("%nFields(%d):%n", fields_count); 
+        // sometimes fields[0] is magic used for serialization
+        System.out.printf("%nFields(%d):%n", fields_count);
 
         for (int i = 0; i < fields_count; i++) {
             processFieldOrMethod();
             if (i < fields_count - 1) {
-                System.out.println(); 
+                System.out.println();
             }
         }
     }
@@ -262,12 +262,12 @@
         methods_count = file.readUnsignedShort();
         methods = new Method[methods_count];
 
-        System.out.printf("%nMethods(%d):%n", methods_count); 
+        System.out.printf("%nMethods(%d):%n", methods_count);
 
         for (int i = 0; i < methods_count; i++) {
             processFieldOrMethod();
             if (i < methods_count - 1) {
-                System.out.println(); 
+                System.out.println();
             }
         }
     }
@@ -282,7 +282,7 @@
         attributes_count = file.readUnsignedShort();
         attributes = new Attribute[attributes_count];
 
-        System.out.printf("%nAttributes(%d):%n", attributes_count); 
+        System.out.printf("%nAttributes(%d):%n", attributes_count);
 
         for (int i = 0; i < attributes_count; i++) {
             attributes[i] = Attribute.readAttribute(file, constant_pool);
@@ -303,17 +303,17 @@
     private final void processFieldOrMethod () throws IOException, ClassFormatException {
         final int access_flags = file.readUnsignedShort();
         final int name_index = file.readUnsignedShort();
-        System.out.printf("  name_index: %d (", name_index); 
-        System.out.println(constantToString(name_index) + ")"); 
+        System.out.printf("  name_index: %d (", name_index);
+        System.out.println(constantToString(name_index) + ")");
         System.out.println("  access_flags: " + BCELifier.printFlags(access_flags,
                 BCELifier.FLAGS.METHOD));
         final int descriptor_index = file.readUnsignedShort();
-        System.out.printf("  descriptor_index: %d (", descriptor_index); 
-        System.out.println(constantToString(descriptor_index) + ")"); 
+        System.out.printf("  descriptor_index: %d (", descriptor_index);
+        System.out.println(constantToString(descriptor_index) + ")");
 
         final int attributes_count = file.readUnsignedShort();
         final Attribute[] attributes = new Attribute[attributes_count];
-        System.out.println("  attribute count: " + attributes_count); 
+        System.out.println("  attribute count: " + attributes_count);
 
         for (int i = 0; i < attributes_count; i++) {
             // going to peek ahead a bit
@@ -323,10 +323,10 @@
             // restore file location
             file.reset();
             // Usefull for debugging
-            // System.out.printf("  attribute_name_index: %d (", attribute_name_index); 
-            // System.out.println(constantToString(attribute_name_index) + ")"); 
-            // System.out.printf("  atribute offset in file: %x%n", + file.getStreamPosition()); 
-            // System.out.println("  atribute_length: " + attribute_length); 
+            // System.out.printf("  attribute_name_index: %d (", attribute_name_index);
+            // System.out.println(constantToString(attribute_name_index) + ")");
+            // System.out.printf("  atribute offset in file: %x%n", + file.getStreamPosition());
+            // System.out.println("  atribute_length: " + attribute_length);
 
             // A stronger verification test would be to read attribute_length bytes
             // into a buffer.  Then pass that buffer to readAttribute and also
@@ -337,17 +337,17 @@
             final long pos2 = file.getStreamPosition();
             if ((pos2 - pos1) != (attribute_length + 6)) {
                 System.out.printf("%nWHOOPS attribute_length: %d pos2-pos1-6: %d pos1: %x(%d) pos2: %x(%d)%n",
-                        attribute_length, pos2-pos1-6, pos1, pos1, pos2, pos2); 
+                        attribute_length, pos2-pos1-6, pos1, pos1, pos2, pos2);
             }
-            System.out.printf("  "); 
-            System.out.println(attributes[i]); 
+            System.out.printf("  ");
+            System.out.println(attributes[i]);
         }
     }
 
     private final String constantToString (final int index) {
-        final Constant c = constant_items[index]; 
-        return constant_pool.constantToString(c); 
-    }    
+        final Constant c = constant_items[index];
+        return constant_pool.constantToString(c);
+    }
 
 }
 
diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java
index eb45906..00487c7 100644
--- a/src/examples/HelloWorldBuilder.java
+++ b/src/examples/HelloWorldBuilder.java
@@ -44,15 +44,15 @@
  *     public static void main(String[] argv) {
  *         BufferedReader in   = new BufferedReader(new InputStreamReader(System.in));
  *         String name = null;
- * 
+ *
  *         try {
  *             System.out.print("Please enter your name> ");
  *             name = in.readLine();
- *         } catch(IOException e) { 
+ *         } catch(IOException e) {
  *             System.out.println(e);
- *             return; 
+ *             return;
  *         }
- * 
+ *
  *         System.out.println("Hello, " + name);
  *     }
  * }
@@ -148,7 +148,7 @@
                 Type.VOID, new Type[]{Type.STRING},
                 Constants.INVOKESPECIAL));
         il.append(new ALOAD(name));
-    
+
         // Concatenate strings using a StringBuffer and print them.
         il.append(factory.createInvoke("java.lang.StringBuffer", "append",
                 Type.STRINGBUFFER, new Type[]{Type.STRING},
diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java
index 943c51f..002032c 100644
--- a/src/examples/Mini/ASCII_CharStream.java
+++ b/src/examples/Mini/ASCII_CharStream.java
@@ -364,7 +364,7 @@
         bufcolumn[j] = newCol + columnDiff;
         columnDiff = nextColDiff;
         i++;
-     } 
+     }
 
      if (i < len)
      {
diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java
index a82442b..63e87c7 100644
--- a/src/examples/Mini/ASTExpr.java
+++ b/src/examples/Mini/ASTExpr.java
@@ -47,7 +47,7 @@
  * obeying the aritmetical precedences (* stronger than +, etc.) and
  * are discarded in the first pass.
 */
-public class ASTExpr extends SimpleNode 
+public class ASTExpr extends SimpleNode
 implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants {
   protected int         kind=-1;    // Single twig to leaf?
   private   int         unop=-1;    // Special case: Unary operand applied
@@ -87,7 +87,7 @@
 
   /* Special constructor, called from ASTTerm.traverse() and
    * ASTFactor.traverse(), when traverse()ing the parse tree replace
-   * themselves with Expr nodes. 
+   * themselves with Expr nodes.
    */
   ASTExpr(final ASTExpr[] children, final int kind, final int line, final int column) {
     this(line, column, kind, JJTEXPR);
@@ -140,25 +140,25 @@
       for(int i=0; i < exprs.length; i++) {
         exprs[i] = exprs[i].traverse(env); // References may change
     }
-    
+
       return this;
     }
   }
 
-  /** 
+  /**
    * Second and third pass
    * @return type of expression
    * @param expected type
    */
   public int eval(final int expected) {
     int child_type = T_UNKNOWN, t;
-    
+
     is_simple = true;
 
     // Determine expected node type depending on used operator.
     if(unop != -1) {
       if(unop == MINUS) {
-        child_type = type = T_INT;  // - 
+        child_type = type = T_INT;  // -
     } else {
         child_type = type = T_BOOLEAN; // !
     }
@@ -178,7 +178,7 @@
 
     // Get type of subexpressions
     for(int i=0; i < exprs.length; i++) {
-      t = exprs[i].eval(child_type); 
+      t = exprs[i].eval(child_type);
 
       if(t != child_type) {
         MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(),
@@ -202,7 +202,7 @@
 
   /**
    * Fourth pass, produce Java code.
-   */  
+   */
   public void code(final StringBuffer buf) {
     if(unop != -1) {
       exprs[0].code(buf);
@@ -225,7 +225,7 @@
       case MULT:  ASTFunDecl.push(buf, _body_int + " * " + _body_int2); break;
       case DIV:   ASTFunDecl.push(buf, _body_int + " / " + _body_int2); break;
 
-      case AND:   ASTFunDecl.push(buf, toInt(toBool(_body_int) + " && " + 
+      case AND:   ASTFunDecl.push(buf, toInt(toBool(_body_int) + " && " +
               toBool(_body_int2))); break;
       case OR:    ASTFunDecl.push(buf, toInt(toBool(_body_int) + " || " +
               toBool(_body_int2))); break;
diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java
index 4b2e507..0cb714b 100644
--- a/src/examples/Mini/ASTFunDecl.java
+++ b/src/examples/Mini/ASTFunDecl.java
@@ -52,7 +52,7 @@
   private ASTIdent[]  argv;
   private ASTExpr     body;
   private int         type = T_UNKNOWN;
-  private int         line, column; 
+  private int         line, column;
   private boolean     is_simple;  // true, if simple expression like `12 + f(a)'
   private boolean     is_recursive; // Not used yet, TODO
 //  private int         max_depth; // max. expression tree depth
@@ -73,13 +73,13 @@
 
   ASTFunDecl(final ASTIdent name, final ASTIdent[] argv, final ASTExpr body, final int type) {
     this(JJTFUNDECL);
-    
+
     this.name = name;
     this.argv = argv;
     this.body = body;
     this.type = type;
   }
-  
+
   /**
    * Overrides SimpleNode.closeNode()
    * Cast children to appropiate type.
@@ -118,12 +118,12 @@
     /* Update entry of this function, i.e. set argument references.
      * The entry is already in there by garantuee, but may be of wrong type,
      * i.e. the user defined a function `TRUE', e.g. and `TRUE' is of type `Variable'.
-     */   
+     */
     try {
       final Function fun = (Function)env.get(name.getName());
       fun.setArgs(argv);
     } catch(final ClassCastException e) {} // Who cares?
-    
+
     body = body.traverse(env); // Traverse expression body
 
     return this;
@@ -138,7 +138,7 @@
 
     if((expected != T_UNKNOWN) && (type != expected)) {
         MiniC.addError(line, column,
-                     "Function f ist not of type " + TYPE_NAMES[expected] + 
+                     "Function f ist not of type " + TYPE_NAMES[expected] +
                      " as previously assumed, but " + TYPE_NAMES[type]);
     }
 
@@ -172,18 +172,18 @@
     else {
       out.print("  public static final " + "int" + // type_names[type] +
                 " " + fname + "(");
-      
+
       for(int i = 0; i < argv.length; i++) {
         out.print("int " + argv[i].getName());
-        
+
         if(i < argv.length - 1) {
         out.print(", ");
     }
       }
-      
+
       out.println(")\n    throws IOException\n  {");
     }
-    
+
     if(!ignore) {
       final StringBuffer buf = new StringBuffer();
 
diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java
index d331d9a..a04f4ed 100644
--- a/src/examples/Mini/ASTIfExpr.java
+++ b/src/examples/Mini/ASTIfExpr.java
@@ -69,7 +69,7 @@
    * Overrides ASTExpr.traverse()
    */
   @Override
-  public ASTExpr traverse(final Environment env) { 
+  public ASTExpr traverse(final Environment env) {
     this.env = env;
 
     if_expr   = if_expr.traverse(env);
@@ -94,7 +94,7 @@
 
     if((if_type=if_expr.eval(T_BOOLEAN)) != T_BOOLEAN) {
         MiniC.addError(if_expr.getLine(), if_expr.getColumn(),
-                     "IF expression is not of type boolean, but " + 
+                     "IF expression is not of type boolean, but " +
                      TYPE_NAMES[if_type] + ".");
     }
 
diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java
index 364625b..b3a1dbb 100644
--- a/src/examples/Mini/ASTLetExpr.java
+++ b/src/examples/Mini/ASTLetExpr.java
@@ -56,7 +56,7 @@
    */
   @Override
   public void closeNode() {
-    int i; /* length must be a multiple of 
+    int i; /* length must be a multiple of
                                          * two (ident = expr) + 1 (body expr) */
     final int len_2 = children.length / 2;
     idents = new ASTIdent[len_2];
@@ -78,12 +78,12 @@
   @Override
   public ASTExpr traverse(final Environment env) {
     this.env = env;
-    
+
     // Traverse RHS exprs first, so no references to LHS vars are allowed
     for(int i=0; i < exprs.length; i++) {
         exprs[i] = exprs[i].traverse((Environment)env.clone());
     }
-    
+
     // Put argument names into hash table aka. environment
     for(int i=0; i < idents.length; i++) {
       final ASTIdent id    = idents[i];
@@ -99,10 +99,10 @@
     }
 
     body = body.traverse(env);
-    
+
     return this;
   }
-  
+
   /**
    * Second pass
    * Overrides AstExpr.eval()
@@ -115,7 +115,7 @@
 
     for(int i=0; i < idents.length; i++) {
       final int t = exprs[i].eval(T_UNKNOWN);
-      
+
       idents[i].setType(t);
       //      is_simple = is_simple && exprs[i].isSimple();
     }
diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java
index 8966ccf..7d52785 100644
--- a/src/examples/Mini/ASTProgram.java
+++ b/src/examples/Mini/ASTProgram.java
@@ -57,7 +57,7 @@
      * WRITE has one arg of type T_INT, both return T_INT.
      */
     ASTIdent   ident  = new ASTIdent("WRITE", T_INT, -1, -1);
-    ASTIdent[] args   = { new ASTIdent("", T_INT, -1, -1) }; 
+    ASTIdent[] args   = { new ASTIdent("", T_INT, -1, -1) };
     Function   fun    = new Function(ident, args, true);
     env.put(fun);
 
@@ -65,7 +65,7 @@
     args  = new ASTIdent[0];
     fun   = new Function(ident, args, true);
     env.put(fun);
-    
+
     /* Add predefined idents TRUE/FALSE of type T_BOOLEAN
      */
     ident = new ASTIdent("TRUE", T_BOOLEAN, -1, -1);
@@ -103,7 +103,7 @@
    *
    * Put everything into the environment, which is copied appropiately to each
    * recursion level, i.e. each FunDecl gets its own copy that it can further
-   * manipulate. 
+   * manipulate.
    *
    * Checks for name clashes of function declarations.
    */
@@ -121,7 +121,7 @@
         name  = f.getName();
         fname = name.getName();
         fun   = env.get(fname); // Lookup in env
-        
+
         if(fun != null) {
         MiniC.addError(f.getLine(), f.getColumn(),
                          "Redeclaration of " + fun + ".");
@@ -129,24 +129,24 @@
         env.put(new Function(name, null)); // `args' will be set by FunDecl.traverse()
     }
 
-        
+
       }
 
       // Go for it
       for(int i=0; i < fun_decls.length; i++) {
         fun_decls[i] = fun_decls[i].traverse((Environment)env.clone());
-        
+
         // Look for `main' routine
         fname = fun_decls[i].getName().getName();
         if(fname.equals("main")) {
         main = (Function)env.get(fname);
     }
       }
-      
+
       if(main == null) {
         MiniC.addError(0, 0, "You didn't declare a `main' function.");
     } else if(main.getNoArgs() != 0) {
-        MiniC.addError(main.getLine(), main.getColumn(), 
+        MiniC.addError(main.getLine(), main.getColumn(),
                         "Main function has too many arguments declared.");
     }
     }
@@ -154,7 +154,7 @@
     return this;
   }
 
-  /** 
+  /**
    * Second pass, determine type of each node, if possible.
    */
   public void eval(final int pass) {
@@ -183,11 +183,11 @@
     out.println("import java.io.IOException;\n");
 
     out.println("public final class " + name + " {");
-    out.println("  private static BufferedReader _in = new BufferedReader" + 
+    out.println("  private static BufferedReader _in = new BufferedReader" +
                 "(new InputStreamReader(System.in));\n");
 
     out.println("  private static int _readInt() throws IOException {\n" +
-                "    System.out.print(\"Please enter a number> \");\n" + 
+                "    System.out.print(\"Please enter a number> \");\n" +
                 "    return Integer.parseInt(_in.readLine());\n  }\n");
 
     out.println("  private static int _writeInt(int n) {\n" +
@@ -268,7 +268,7 @@
     il.append(new INVOKEVIRTUAL(cp.addMethodref("java.lang.StringBuffer",
                                                 "toString",
                                                 "()Ljava/lang/String;")));
-    
+
     il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream",
                                                 "println",
                                                 "(Ljava/lang/String;)V")));
@@ -294,7 +294,7 @@
 
     method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, null,
                            "<init>", class_name, il, cp);
-    
+
     method.setMaxStack(1);
     class_gen.addMethod(method.getMethod());
 
diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java
index 3f61c02..1afd1bf 100644
--- a/src/examples/Mini/Environment.java
+++ b/src/examples/Mini/Environment.java
@@ -26,14 +26,14 @@
  * That environment contains all function definitions and identifiers.
  * Hash keys are Strings (identifiers), which are mapped to a table index.
  *
- * The table consists of `SIZE' fields which have `SLOTS' subfields. Thus 
+ * The table consists of `SIZE' fields which have `SLOTS' subfields. Thus
  * the maximum number of storable items is `SLOTS' * `SIZE'.
  *
  */
 public class Environment implements Cloneable {
   private static final int SIZE  = 127; // Prime number large enough for most cases
   private static final int SLOTS = 3;   // Number of slots of each field
-  
+
   private final int       size;               // The table is an array of
   private final Vector<EnvEntry>[]  table;              // Vectors
   private int       elements=0;
@@ -136,7 +136,7 @@
     } catch(final ArrayIndexOutOfBoundsException e) {}
   }
 
-  private static int lookup(final Vector<EnvEntry> v, final String key) 
+  private static int lookup(final Vector<EnvEntry> v, final String key)
        throws ArrayIndexOutOfBoundsException
   {
     final int len = v.size();
@@ -153,7 +153,7 @@
   }
 
   @Override
-  public Object clone() { 
+  public Object clone() {
     final Vector<EnvEntry>[] copy = new Vector[size];
 
     for(int i=0; i < size; i++) {
@@ -199,7 +199,7 @@
           for(int j=0; j < len; j++) {
         entries[k++] = v.elementAt(j);
     }
-        } catch(final ArrayIndexOutOfBoundsException e) {}  
+        } catch(final ArrayIndexOutOfBoundsException e) {}
       }
     }
 
diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java
index f6c56bd..b584a69 100644
--- a/src/examples/Mini/Function.java
+++ b/src/examples/Mini/Function.java
@@ -45,7 +45,7 @@
     column   = name.getColumn();
     setArgs(args);
   }
-  
+
   @Override
   public String toString() {
     final StringBuffer buf = new StringBuffer();
@@ -74,8 +74,8 @@
   public int        getColumn()       { return column; }
   public ASTIdent   getArg(final int i)     { return args[i]; }
   public ASTIdent[] getArgs()         { return args; }
-  public void       setArgs(final ASTIdent[] args) { 
-    this.args = args; 
+  public void       setArgs(final ASTIdent[] args) {
+    this.args = args;
     no_args   = (args == null)? 0 : args.length;
   }
 }
diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java
index 645c0fc..34a7b3e 100644
--- a/src/examples/Mini/MiniC.java
+++ b/src/examples/Mini/MiniC.java
@@ -30,7 +30,7 @@
   private static Vector<String> warnings = null;
   private static String file     = null;
   private static int   pass      = 0;
-        
+
   public static void main(final String[] argv) {
     final String[]   file_name = new String[argv.length];
     int        files=0;
@@ -55,7 +55,7 @@
           file_name[files++] = argv[i];
         }
       }
-        
+
       if(files == 0) {
         System.err.println("Nothing to compile.");
     }
@@ -170,7 +170,7 @@
 
     if(diff > 0) {
       final char[] chs = new char[diff];
-      
+
       for(int i=0; i < diff; i++) {
         chs[i] = ' ';
     }
diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java
index 694e1f7..bffe0b1 100644
--- a/src/examples/Mini/MiniParserTokenManager.java
+++ b/src/examples/Mini/MiniParserTokenManager.java
@@ -317,7 +317,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(0, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(1, active0);
@@ -361,7 +361,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(1, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(2, active0);
@@ -399,7 +399,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(2, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(3, active0);
@@ -554,34 +554,34 @@
    }
 }
 static final int[] jjnextStates = {
-   4, 5, 
+   4, 5,
 };
 public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, "\106\125\116", 
-"\111\106", "\124\110\105\116", "\105\114\123\105", "\106\111", "\114\105\124", 
-"\111\116", "\76", "\74", "\76\75", "\74\75", "\75\75", "\41\75", "\41", 
-"\106\101\114\123\105", "\124\122\125\105", "\101\116\104", "\117\122", "\53", "\55", "\52", "\45", 
-"\57", "\50", "\51", "\75", "\54", "\122\105\101\104", "\127\122\111\124\105", null, 
+"", null, null, null, null, null, null, null, null, "\106\125\116",
+"\111\106", "\124\110\105\116", "\105\114\123\105", "\106\111", "\114\105\124",
+"\111\116", "\76", "\74", "\76\75", "\74\75", "\75\75", "\41\75", "\41",
+"\106\101\114\123\105", "\124\122\125\105", "\101\116\104", "\117\122", "\53", "\55", "\52", "\45",
+"\57", "\50", "\51", "\75", "\54", "\122\105\101\104", "\127\122\111\124\105", null,
 null, null, null, null, };
 public static final String[] lexStateNames = {
-   "DEFAULT", 
-   "SINGLE_LINE_COMMENT_STATE", 
+   "DEFAULT",
+   "SINGLE_LINE_COMMENT_STATE",
 };
 public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 };
 static final long[] jjtoToken = {
-   0x73ffffffe01L, 
+   0x73ffffffe01L,
 };
 static final long[] jjtoSkip = {
-   0xbeL, 
+   0xbeL,
 };
 static final long[] jjtoSpecial = {
-   0x80L, 
+   0x80L,
 };
 static final long[] jjtoMore = {
-   0x140L, 
+   0x140L,
 };
 static private ASCII_CharStream input_stream;
 static private final int[] jjrounds = new int[6];
@@ -654,7 +654,7 @@
 static int jjmatchedPos;
 static int jjmatchedKind;
 
-public static Token getNextToken() 
+public static Token getNextToken()
 {
   Token specialToken = null;
   Token matchedToken;
@@ -662,13 +662,13 @@
 
   EOFLoop :
   for (;;)
-  {   
-   try   
-   {     
+  {
+   try
+   {
       curChar = ASCII_CharStream.BeginToken();
-   }     
+   }
    catch(final java.io.IOException e)
-   {        
+   {
       jjmatchedKind = 0;
       matchedToken = jjFillToken();
       matchedToken.specialToken = specialToken;
diff --git a/src/examples/Mini/Node.java b/src/examples/Mini/Node.java
index 18cc9cb..3a0ade2 100644
--- a/src/examples/Mini/Node.java
+++ b/src/examples/Mini/Node.java
@@ -36,7 +36,7 @@
   /** This pair of methods are used to inform the node of its
     parent. */
   void jjtSetParent(Node n);
-  
+
   Node jjtGetParent();
 
   /** This method tells the node to add its argument to the node's
diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java
index 399b9bd..99aee2b 100644
--- a/src/examples/Mini/ParseException.java
+++ b/src/examples/Mini/ParseException.java
@@ -141,7 +141,7 @@
         break;
       }
       retval += add_escapes(tok.image);
-      tok = tok.next; 
+      tok = tok.next;
     }
     retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
     if (expectedTokenSequences.length == 1) {
@@ -157,7 +157,7 @@
    * The end of line string for this machine.
    */
   protected String eol = System.getProperty("line.separator", "\n");
- 
+
   /**
    * Used to convert raw characters to their escaped version
    * when these raw version cannot be used as part of an ASCII
diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java
index 54ed00d..0f91b76 100644
--- a/src/examples/Mini/SimpleNode.java
+++ b/src/examples/Mini/SimpleNode.java
@@ -46,7 +46,7 @@
 
   public void closeNode() {
   }
-  
+
   public void jjtSetParent(final Node n) { parent = n; }
   public Node jjtGetParent() { return parent; }
 
diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java
index 587d3f7..4e9340a 100644
--- a/src/examples/Mini/TokenMgrError.java
+++ b/src/examples/Mini/TokenMgrError.java
@@ -102,7 +102,7 @@
    /**
     * Returns a detailed message for the Error when it is thrown by the
     * token manager to indicate a lexical error.
-    * Parameters : 
+    * Parameters :
     *    EOFSeen     : indicates if EOF caused the lexicl error
     *    curLexState : lexical state in which this error occured
     *    errorLine   : line number when the error occured
@@ -122,7 +122,7 @@
    /**
     * You can also modify the body of this method to customize your error messages.
     * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like : 
+    * of end-users concern, so you can return something like :
     *
     *     "Internal Error : Please file a bug report .... "
     *
diff --git a/src/examples/helloify.java b/src/examples/helloify.java
index 2df07b7..44c05cc 100644
--- a/src/examples/helloify.java
+++ b/src/examples/helloify.java
@@ -95,7 +95,7 @@
         if (m.isNative() || m.isAbstract() || (code == null)) {
             return m;
         }
-    
+
         // Create instruction list to be inserted at method start.
         final String mesg = "Hello from " + Utility.methodSignatureToString(m.getSignature(),
                 name,
diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java
index 029f584..91fcb94 100644
--- a/src/examples/patchclass.java
+++ b/src/examples/patchclass.java
@@ -56,7 +56,7 @@
     }
 
     /*
-     * Replace all occurences of string "<em>old</em>" with 
+     * Replace all occurences of string "<em>old</em>" with
      * "<em>replacement</em>" in all Utf8 constants
      */
     private static void patchIt(final String old, final String replacement, final Constant[] constant_pool) {
diff --git a/src/main/java/org/apache/bcel/Const.java b/src/main/java/org/apache/bcel/Const.java
index ba9e156..139bd74 100644
--- a/src/main/java/org/apache/bcel/Const.java
+++ b/src/main/java/org/apache/bcel/Const.java
@@ -336,7 +336,7 @@
    */
   @Deprecated
   public static final short MAX_ACC_FLAG     = ACC_ENUM;
-  
+
   /** One of the access flags for fields, methods, or classes.
    * ACC_MODULE is negative as a short.
    * @see #ACC_PUBLIC
diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java
index 9e5ef21..edcccb4 100644
--- a/src/main/java/org/apache/bcel/Repository.java
+++ b/src/main/java/org/apache/bcel/Repository.java
@@ -37,7 +37,7 @@
     private static org.apache.bcel.util.Repository repository = SyntheticRepository.getInstance();
 
 
-    /** 
+    /**
      * @return currently used repository instance
      */
     public static org.apache.bcel.util.Repository getRepository() {
@@ -45,7 +45,7 @@
     }
 
 
-    /** 
+    /**
      * Sets repository instance to be used for class loading
      */
     public static void setRepository( final org.apache.bcel.util.Repository rep ) {
@@ -53,7 +53,7 @@
     }
 
 
-    /** 
+    /**
      * Lookups class somewhere found on your CLASSPATH, or whereever the
      * repository instance looks for it.
      *
@@ -68,7 +68,7 @@
 
     /**
      * Tries to find class source using the internal repository instance.
-     * 
+     *
      * @see Class
      * @return JavaClass object for given runtime class
      * @throws ClassNotFoundException if the class could not be found or
@@ -97,7 +97,7 @@
     }
 
 
-    /** 
+    /**
      * Clears the repository.
      */
     public static void clearCache() {
diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java
index e833c96..72e5c4e 100644
--- a/src/main/java/org/apache/bcel/classfile/Attribute.java
+++ b/src/main/java/org/apache/bcel/classfile/Attribute.java
@@ -49,7 +49,7 @@
 public abstract class Attribute implements Cloneable, Node {
 
     private static final boolean debug = Boolean.getBoolean(Attribute.class.getCanonicalName() + ".debug"); // Debugging on/off
-    
+
     private static final Map<String, Object> readers = new HashMap<>();
 
     /**
@@ -270,7 +270,7 @@
      */
     @Override
     public abstract void accept(Visitor v);
-    
+
     /**
      * Use copy() if you want to have a deep copy(), i.e., with all references
      * copied correctly.
diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
index 6ac696e..f421f66 100644
--- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
+++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
@@ -40,18 +40,18 @@
  * <p>
  * Here is a sample Maven invocation with caching disabled:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dbcel.statistics=true -Dbcel.maxcached.size=0 -Dbcel.maxcached=0
  * </pre>
  * <p>
  * Here is a sample Maven invocation with caching enabled:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dbcel.statistics=true -Dbcel.maxcached.size=100000 -Dbcel.maxcached=5000000
  * </pre>
- * 
+ *
  * @see Constant
  */
 public final class ConstantUtf8 extends Constant {
@@ -105,7 +105,7 @@
 
     /**
      * Clears the cache.
-     * 
+     *
      * @since 6.4.0
      */
     public static synchronized void clearCache() {
@@ -122,7 +122,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param value the value.
      * @return a new or cached instance of the given value.
      * @since 6.0
@@ -150,7 +150,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param dataInput the value.
      * @return a new or cached instance of the given value.
      * @throws IOException if an I/O error occurs.
@@ -165,7 +165,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param value the value.
      * @return a new or cached instance of the given value.
      * @since 6.0
@@ -187,7 +187,7 @@
 
     /**
      * Initializes from another object.
-     * 
+     *
      * @param constantUtf8 the value.
      */
     public ConstantUtf8(final ConstantUtf8 constantUtf8) {
diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java
index f8100cf..7ad67e4 100644
--- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java
+++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java
@@ -45,7 +45,7 @@
     // Technically, a decscriptor_index for a local variable table entry
     // and a signature_index for a local variable type table entry.
     private int signature_index; // Index of variable signature
-    private int index; /* Variable is `index'th local variable on
+    private int index; /* Variable is index'th local variable on
      * this method's frame.
      */
     private ConstantPool constant_pool;
@@ -53,18 +53,19 @@
 
 
     /**
-     * Initialize from another object. Note that both objects use the same
+     * Initializes from another LocalVariable. Note that both objects use the same
      * references (shallow copy). Use copy() for a physical copy.
+     *
+     * @param localVariable Another LocalVariable.
      */
-    public LocalVariable(final LocalVariable c) {
-        this(c.getStartPC(), c.getLength(), c.getNameIndex(), c.getSignatureIndex(), c.getIndex(),
-                c.getConstantPool());
-        this.orig_index = c.getOrigIndex();
+    public LocalVariable(final LocalVariable localVariable) {
+        this(localVariable.getStartPC(), localVariable.getLength(), localVariable.getNameIndex(),
+                localVariable.getSignatureIndex(), localVariable.getIndex(), localVariable.getConstantPool());
+        this.orig_index = localVariable.getOrigIndex();
     }
 
-
     /**
-     * Construct object from file stream.
+     * Constructs object from file stream.
      * @param file Input stream
      * @throws IOException
      */
@@ -129,20 +130,20 @@
 
 
     /**
-     * Dump local variable to file stream in binary format.
+     * Dumps local variable to file stream in binary format.
      *
-     * @param file Output file stream
-     * @throws IOException
+     * @param dataOutputStream Output file stream
+     * @exception IOException if an I/O error occurs.
+     * @see java.io.FilterOutputStream#out
      */
-    public void dump( final DataOutputStream file ) throws IOException {
-        file.writeShort(start_pc);
-        file.writeShort(length);
-        file.writeShort(name_index);
-        file.writeShort(signature_index);
-        file.writeShort(index);
+    public void dump(final DataOutputStream dataOutputStream) throws IOException {
+        dataOutputStream.writeShort(start_pc);
+        dataOutputStream.writeShort(length);
+        dataOutputStream.writeShort(name_index);
+        dataOutputStream.writeShort(signature_index);
+        dataOutputStream.writeShort(index);
     }
 
-
     /**
      * @return Constant pool used by this object.
      */
@@ -212,7 +213,7 @@
 
 
     /**
-     * @return Start of range where he variable is valid
+     * @return Start of range where the variable is valid
      */
     public int getStartPC() {
         return start_pc;
diff --git a/src/main/java/org/apache/bcel/classfile/Module.java b/src/main/java/org/apache/bcel/classfile/Module.java
index a0a9d62..7b1be3e 100644
--- a/src/main/java/org/apache/bcel/classfile/Module.java
+++ b/src/main/java/org/apache/bcel/classfile/Module.java
@@ -40,7 +40,7 @@
     private ModuleExports[] exports_table;
     private ModuleOpens[] opens_table;
     private final int uses_count;
-    private final int uses_index[];
+    private final int[] uses_index;
     private ModuleProvides[] provides_table;
 
     /**
@@ -191,7 +191,7 @@
         buf.append("Module:\n");
         buf.append("  name:    ") .append(cp.getConstantString(module_name_index, Const.CONSTANT_Module).replace('/', '.')).append("\n");
         buf.append("  flags:   ") .append(String.format("%04x", module_flags)).append("\n");
-        final String version = (module_version_index == 0 ? "0" : cp.getConstantString(module_version_index, Const.CONSTANT_Utf8));
+        final String version = module_version_index == 0 ? "0" : cp.getConstantString(module_version_index, Const.CONSTANT_Utf8);
         buf.append("  version: ") .append(version).append("\n");
 
         buf.append("  requires(").append(requires_table.length).append("):\n");
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleExports.java b/src/main/java/org/apache/bcel/classfile/ModuleExports.java
index e654b86..ab10d07 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleExports.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleExports.java
@@ -35,7 +35,7 @@
     private final int exports_index;  // points to CONSTANT_Package_info
     private final int exports_flags;
     private final int exports_to_count;
-    private final int exports_to_index[];  // points to CONSTANT_Module_info
+    private final int[] exports_to_index;  // points to CONSTANT_Module_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleOpens.java b/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
index a4cf6da..2cbf22b 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
@@ -35,7 +35,7 @@
     private final int opens_index;  // points to CONSTANT_Package_info
     private final int opens_flags;
     private final int opens_to_count;
-    private final int opens_to_index[];  // points to CONSTANT_Module_info
+    private final int[] opens_to_index;  // points to CONSTANT_Module_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleProvides.java b/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
index 5996e6b..15f5621 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
@@ -34,7 +34,7 @@
 
     private final int provides_index;  // points to CONSTANT_Class_info
     private final int provides_with_count;
-    private final int provides_with_index[];  // points to CONSTANT_Class_info
+    private final int[] provides_with_index;  // points to CONSTANT_Class_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleRequires.java b/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
index 136a227..2d5d80b 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
@@ -94,7 +94,7 @@
         final String module_name = constant_pool.constantToString(requires_index, Const.CONSTANT_Module);
         buf.append(Utility.compactClassName(module_name, false));
         buf.append(", ").append(String.format("%04x", requires_flags));
-        final String version = (requires_version_index == 0 ? "0" : constant_pool.getConstantString(requires_version_index, Const.CONSTANT_Utf8));
+        final String version = requires_version_index == 0 ? "0" : constant_pool.getConstantString(requires_version_index, Const.CONSTANT_Utf8);
         buf.append(", ").append(version);
         return buf.toString();
     }
diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java
index 0655c13..966b004 100644
--- a/src/main/java/org/apache/bcel/classfile/Visitor.java
+++ b/src/main/java/org/apache/bcel/classfile/Visitor.java
@@ -173,63 +173,63 @@
     /**
      * @since 6.4.0
      */
-    default void visitModule(Module constantModule) {
+    default void visitModule(final Module constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleRequires(ModuleRequires constantModule) {
-        // empty
-    }
-    
-    /**
-     * @since 6.4.0
-     */
-    default void visitModuleExports(ModuleExports constantModule) {
+    default void visitModuleRequires(final ModuleRequires constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleOpens(ModuleOpens constantModule) {
+    default void visitModuleExports(final ModuleExports constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleProvides(ModuleProvides constantModule) {
+    default void visitModuleOpens(final ModuleOpens constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModulePackages(ModulePackages constantModule) {
+    default void visitModuleProvides(final ModuleProvides constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleMainClass(ModuleMainClass obj) {
+    default void visitModulePackages(final ModulePackages constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitNestHost(NestHost obj) {
+    default void visitModuleMainClass(final ModuleMainClass obj) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitNestMembers(NestMembers obj) {
+    default void visitNestHost(final NestHost obj) {
+        // empty
+    }
+
+    /**
+     * @since 6.4.0
+     */
+    default void visitNestMembers(final NestMembers obj) {
         // empty
     }
 }
diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java
index 9cb7f0a..a31e55a 100644
--- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java
+++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java
@@ -33,30 +33,26 @@
  */
 public interface InstructionComparator {
 
-    InstructionComparator DEFAULT = new InstructionComparator() {
-
-        @Override
-        public boolean equals( final Instruction i1, final Instruction i2 ) {
-            if (i1.getOpcode() == i2.getOpcode()) {
-                if (i1 instanceof BranchInstruction) {
-                 // BIs are never equal to make targeters work correctly (BCEL-195)
-                    return false;
+    InstructionComparator DEFAULT = (i1, i2) -> {
+        if (i1.getOpcode() == i2.getOpcode()) {
+            if (i1 instanceof BranchInstruction) {
+             // BIs are never equal to make targeters work correctly (BCEL-195)
+                return false;
 //                } else if (i1 == i2) { TODO consider adding this shortcut
 //                    return true; // this must be AFTER the BI test
-                } else if (i1 instanceof ConstantPushInstruction) {
-                    return ((ConstantPushInstruction) i1).getValue().equals(
-                            ((ConstantPushInstruction) i2).getValue());
-                } else if (i1 instanceof IndexedInstruction) {
-                    return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2)
-                            .getIndex();
-                } else if (i1 instanceof NEWARRAY) {
-                    return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2).getTypecode();
-                } else {
-                    return true;
-                }
+            } else if (i1 instanceof ConstantPushInstruction) {
+                return ((ConstantPushInstruction) i1).getValue().equals(
+                        ((ConstantPushInstruction) i2).getValue());
+            } else if (i1 instanceof IndexedInstruction) {
+                return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2)
+                        .getIndex();
+            } else if (i1 instanceof NEWARRAY) {
+                return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2).getTypecode();
+            } else {
+                return true;
             }
-            return false;
         }
+        return false;
     };
 
 
diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java
index 323aa32..552e8a3 100644
--- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java
+++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java
@@ -59,14 +59,14 @@
 

     /**

      * Does nothing.

-     * 

+     *

      * @deprecated Does nothing as of 6.3.1.

      */

     @Deprecated

     protected void addHandle() {

         // noop

     }

-    

+

     public final InstructionHandle getNext() {

         return next;

     }

diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
index b7722af..d2316df 100644
--- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
+++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
@@ -21,7 +21,7 @@
 import org.apache.bcel.classfile.LocalVariable;
 
 /**
- * This class represents a local variable within a method. It contains its
+ * Represents a local variable within a method. It contains its
  * scope, name and type. The generated LocalVariable object can be obtained
  * with getLocalVariable which needs the instruction list and the constant
  * pool as parameters.
@@ -66,7 +66,7 @@
 
 
     /**
-     * Generate a local variable that with index `index'. Note that double and long
+     * Generates a local variable that with index `index'. Note that double and long
      * variables need two indexs. Index indices have to be provided by the user.
      *
      * @param index index of local variable
@@ -84,7 +84,7 @@
 
 
     /**
-     * Get LocalVariable object.
+     * Gets LocalVariable object.
      *
      * This relies on that the instruction list has already been dumped to byte code or
      * or that the `setPositions' methods has been called for the instruction list.
diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java
index 48d0776..b0743e3 100644
--- a/src/main/java/org/apache/bcel/generic/MethodGen.java
+++ b/src/main/java/org/apache/bcel/generic/MethodGen.java
@@ -23,7 +23,6 @@
 import java.util.Stack;
 import java.util.Hashtable;
 import java.util.Arrays;
-import java.util.Comparator;
 
 import org.apache.bcel.Const;
 import org.apache.bcel.classfile.AnnotationEntry;
@@ -358,12 +357,7 @@
             }
         }
         if (size > 1) {
-            Arrays.sort(lg, new Comparator<LocalVariableGen>() {
-                @Override
-                public int compare(final LocalVariableGen o1, final LocalVariableGen o2) {
-                    return o1.getIndex() - o2.getIndex();
-                }
-            });
+            Arrays.sort(lg, (o1, o2) -> o1.getIndex() - o2.getIndex());
         }
         return lg;
     }
diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java
index 7ac79fd..a9954c1 100644
--- a/src/main/java/org/apache/bcel/util/ClassPath.java
+++ b/src/main/java/org/apache/bcel/util/ClassPath.java
@@ -430,22 +430,14 @@
 
     }
 
-    private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() {
-
-        @Override
-        public boolean accept(final File dir, String name) {
-            name = name.toLowerCase(Locale.ENGLISH);
-            return name.endsWith(".zip") || name.endsWith(".jar");
-        }
+    private static final FilenameFilter ARCHIVE_FILTER = (dir, name) -> {
+        name = name.toLowerCase(Locale.ENGLISH);
+        return name.endsWith(".zip") || name.endsWith(".jar");
     };
 
-    private static final FilenameFilter MODULES_FILTER = new FilenameFilter() {
-
-        @Override
-        public boolean accept(final File dir, String name) {
-            name = name.toLowerCase(Locale.ENGLISH);
-            return name.endsWith(".jmod");
-        }
+    private static final FilenameFilter MODULES_FILTER = (dir, name) -> {
+        name = name.toLowerCase(Locale.ENGLISH);
+        return name.endsWith(".jmod");
     };
 
     public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(getClassPath());
diff --git a/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java b/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
index 4b5f099..157a0e7 100644
--- a/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
+++ b/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
@@ -29,7 +29,7 @@
  * This repository supports a class path consisting of too many JAR files to handle in {@link ClassPathRepository} or
  * {@link MemorySensitiveClassPathRepository} without causing {@code OutOfMemoryError}.
  * </p>
- * 
+ *
  * @since 6.4.0
  */
 public class LruCacheClassPathRepository extends AbstractClassPathRepository {
diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
index 3d6b036..1baf276 100644
--- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
+++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
@@ -126,13 +126,7 @@
         jScrollPane1.getViewport().setBackground(Color.red);
         messagesScrollPane.getViewport().setBackground(Color.red);
         messagesScrollPane.setPreferredSize(new Dimension(10, 10));
-        classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                classNamesJList_valueChanged(e);
-            }
-        });
+        classNamesJList.addListSelectionListener(e -> classNamesJList_valueChanged(e));
         classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black));
         jScrollPane3.setPreferredSize(new Dimension(100, 100));
@@ -151,46 +145,16 @@
         newFileMenuItem.setText("New...");
         newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78,
                 InputEvent.CTRL_MASK, true));
-        newFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                newFileMenuItem_actionPerformed(e);
-            }
-        });
+        newFileMenuItem.addActionListener(e -> newFileMenuItem_actionPerformed(e));
         pass3aTextPane.setEditable(false);
         pass3bTextPane.setEditable(false);
-        pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                pass3aJList_valueChanged(e);
-            }
-        });
-        pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                pass3bJList_valueChanged(e);
-            }
-        });
+        pass3aJList.addListSelectionListener(e -> pass3aJList_valueChanged(e));
+        pass3bJList.addListSelectionListener(e -> pass3bJList_valueChanged(e));
         jMenu2.setText("Help");
         whatisMenuItem.setText("What is...");
-        whatisMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                whatisMenuItem_actionPerformed(e);
-            }
-        });
+        whatisMenuItem.addActionListener(e -> whatisMenuItem_actionPerformed(e));
         aboutMenuItem.setText("About");
-        aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                aboutMenuItem_actionPerformed(e);
-            }
-        });
+        aboutMenuItem.addActionListener(e -> aboutMenuItem_actionPerformed(e));
         jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM);
         messagesPanel.add(messagesScrollPane, null);
         messagesScrollPane.getViewport().add(messagesTextPane, null);
diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
index 0c145a4..1874e51 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
@@ -34,7 +34,11 @@
         super(Const.T_UNKNOWN, "Double_Upper");
     }
 
-    /** Use this method to get the single instance of this class. */
+    /**
+     * Gets the single instance of this class.
+     *
+     * @return the single instance of this class.
+     */
     public static DOUBLE_Upper theInstance() {
         return singleton;
     }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
index 788b2b5..b0a27b2 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
@@ -34,7 +34,11 @@
         super(Const.T_UNKNOWN, "Long_Upper");
     }
 
-    /** Use this method to get the single instance of this class. */
+    /**
+     * Gets the single instance of this class.
+     *
+     * @return the single instance of this class.
+     */
     public static LONG_Upper theInstance() {
         return singleton;
     }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
index 9779cc8..3db76d6 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
@@ -28,12 +28,12 @@
  * the name and the type of a local variable in
  * a given slot (== index). This information
  * often changes in course of byte code offsets.
- *
  */
 public class LocalVariableInfo{
 
     /** The types database. KEY: String representing the offset integer. */
     private final Hashtable<String, Type> types = new Hashtable<>();
+
     /** The names database. KEY: String representing the offset integer. */
     private final Hashtable<String, String> names = new Hashtable<>();
 
@@ -44,6 +44,7 @@
     private void setName(final int offset, final String name) {
         names.put(Integer.toString(offset), name);
     }
+
     /**
      * Adds a type of a local variable and a certain slot to our 'types'
      * (Hashtable) database.
@@ -53,54 +54,64 @@
     }
 
     /**
-     * Returns the type of the local variable that uses this local
-     * variable slot at the given bytecode offset.
-     * Care for legal bytecode offsets yourself, otherwise the return value
-     * might be wrong.
-     * May return 'null' if nothing is known about the type of this local
-     * variable slot at the given bytecode offset.
+     * Returns the type of the local variable that uses this local variable slot at the given bytecode offset. Care for
+     * legal bytecode offsets yourself, otherwise the return value might be wrong. May return 'null' if nothing is known
+     * about the type of this local variable slot at the given bytecode offset.
+     *
+     * @param offset bytecode offset.
+     * @return the type of the local variable that uses this local variable slot at the given bytecode offset.
      */
     public Type getType(final int offset) {
         return types.get(Integer.toString(offset));
     }
+
     /**
-     * Returns the name of the local variable that uses this local
-     * variable slot at the given bytecode offset.
-     * Care for legal bytecode offsets yourself, otherwise the return value
-     * might be wrong.
-     * May return 'null' if nothing is known about the type of this local
-     * variable slot at the given bytecode offset.
+     * Returns the name of the local variable that uses this local variable slot at the given bytecode offset. Care for
+     * legal bytecode offsets yourself, otherwise the return value might be wrong. May return 'null' if nothing is known
+     * about the type of this local variable slot at the given bytecode offset.
+     *
+     * @param offset bytecode offset.
+     * @return the name of the local variable that uses this local variable slot at the given bytecode offset.
      */
     public String getName(final int offset) {
         return names.get(Integer.toString(offset));
     }
+
     /**
      * Adds some information about this local variable (slot).
+     *
+     * @param name variable name
+     * @param startPc Range in which the variable is valid.
+     * @param length length of ...
+     * @param type variable type
+     *
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    public void add(final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{
-        for (int i=startpc; i<=startpc+length; i++) { // incl/incl-notation!
-            add(i,name,t);
+    public void add(final String name, final int startPc, final int length, final Type type)
+            throws LocalVariableInfoInconsistentException {
+        for (int i = startPc; i <= startPc + length; i++) { // incl/incl-notation!
+            add(i, name, type);
         }
     }
 
     /**
      * Adds information about name and type for a given offset.
+     *
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException{
+    private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException {
         if (getName(offset) != null) {
-            if (! getName(offset).equals(name)) {
-                throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+
-                    "' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'.");
+            if (!getName(offset).equals(name)) {
+                throw new LocalVariableInfoInconsistentException("At bytecode offset '" + offset
+                        + "' a local variable has two different names: '" + getName(offset) + "' and '" + name + "'.");
             }
         }
         if (getType(offset) != null) {
-            if (! getType(offset).equals(t)) {
-                throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+
-                    "' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'.");
+            if (!getType(offset).equals(t)) {
+                throw new LocalVariableInfoInconsistentException("At bytecode offset '" + offset
+                        + "' a local variable has two different types: '" + getType(offset) + "' and '" + t + "'.");
             }
         }
         setName(offset, name);
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
index 14479e7..069efa6 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
@@ -26,7 +26,6 @@
  * A utility class holding the information about
  * the names and the types of the local variables in
  * a given method.
- *
  */
 public class LocalVariablesInfo{
 
@@ -41,7 +40,12 @@
         }
     }
 
-    /** Returns the LocalVariableInfo for the given slot. */
+    /**
+     * Returns the LocalVariableInfo for the given slot.
+     *
+     * @param slot Slot to query.
+     * @return The LocalVariableInfo for the given slot.
+     */
     public LocalVariableInfo getLocalVariableInfo(final int slot) {
         if (slot < 0 || slot >= localVariableInfos.length) {
             throw new AssertionViolatedException("Slot number for local variable information out of range.");
@@ -52,22 +56,27 @@
     /**
      * Adds information about the local variable in slot 'slot'. Automatically
      * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE.
+     *
+     * @param name variable name
+     * @param startPc Range in which the variable is valid.
+     * @param length length of ...
+     * @param type variable type
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    public void add(final int slot, final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{
+    public void add(final int slot, final String name, final int startPc, final int length, final Type type) throws LocalVariableInfoInconsistentException{
         // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here.
 
         if (slot < 0 || slot >= localVariableInfos.length) {
             throw new AssertionViolatedException("Slot number for local variable information out of range.");
         }
 
-        localVariableInfos[slot].add(name, startpc, length, t);
-        if (t == Type.LONG) {
-            localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance());
+        localVariableInfos[slot].add(name, startPc, length, type);
+        if (type == Type.LONG) {
+            localVariableInfos[slot+1].add(name, startPc, length, LONG_Upper.theInstance());
         }
-        if (t == Type.DOUBLE) {
-            localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance());
+        if (type == Type.DOUBLE) {
+            localVariableInfos[slot+1].add(name, startPc, length, DOUBLE_Upper.theInstance());
         }
     }
 }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
index c7e52c1..fe79b22 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
@@ -1541,13 +1541,17 @@
             cp = jc.getConstantPool();
             (new DescendingVisitor(jc, this)).visit();
         }
+
         /**
          * Returns if the JavaClass this InnerClassDetector is working on
          * has an Inner Class reference in its constant pool.
+         *
+         * @return Whether this InnerClassDetector is working on has an Inner Class reference in its constant pool.
          */
         public boolean innerClassReferenced() {
             return hasInnerClass;
         }
+
         /** This method casually visits ConstantClass references. */
         @Override
         public void visitConstantClass(final ConstantClass obj) {
diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
index 70ec589..af6f037 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
@@ -126,6 +126,7 @@
      * It's here for performance reasons by do_verify() and its callees.
      */
     private InstructionList instructionList;
+
     /**
      * The one and only Code object used by an instance of this class.
      *  It's here for performance reasons by do_verify() and its callees.
diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
index 997bcb7..6081759 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
@@ -88,6 +88,7 @@
     /**
      * Creates a new StringRepresentation object which is the representation of n.
      *
+     * @param n The node to represent.
      * @see #toString()
      */
     public StringRepresentation(final Node n) {
diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
index fd3b237..88dac52 100644
--- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
+++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
@@ -26,18 +26,20 @@
 /**
  * This class implements an array of local variables used for symbolic JVM
  * simulation.
- *
  */
 public class LocalVariables implements Cloneable {
+
     /** The Type[] containing the local variable slots. */
     private final Type[] locals;
 
     /**
      * Creates a new LocalVariables object.
+     *
+     * @param localVariableCount local variable count.
      */
-    public LocalVariables(final int maxLocals) {
-        locals = new Type[maxLocals];
-        for (int i=0; i<maxLocals; i++) {
+    public LocalVariables(final int localVariableCount) {
+        locals = new Type[localVariableCount];
+        for (int i=0; i<localVariableCount; i++) {
             locals[i] = Type.UNKNOWN;
         }
     }
@@ -57,23 +59,29 @@
     }
 
     /**
-     * Returns the type of the local variable slot i.
+     * Returns the type of the local variable slot index.
+     *
+     * @param slotIndex Slot to look up.
+     * @return the type of the local variable slot index.
      */
-    public Type get(final int i) {
-        return locals[i];
+    public Type get(final int slotIndex) {
+        return locals[slotIndex];
     }
 
     /**
      * Returns a (correctly typed) clone of this object.
      * This is equivalent to ((LocalVariables) this.clone()).
+     *
+     * @return a (correctly typed) clone of this object.
      */
     public LocalVariables getClone() {
         return (LocalVariables) this.clone();
     }
 
     /**
-     * Returns the number of local variable slots this
-     * LocalVariables instance has.
+     * Returns the number of local variable slots.
+     *
+     * @return the number of local variable slots.
      */
     public int maxLocals() {
         return locals.length;
@@ -81,12 +89,15 @@
 
     /**
      * Sets a new Type for the given local variable slot.
+     *
+     * @param slotIndex Target slot index.
+     * @param type Type to save at the given slot index.
      */
-    public void set(final int i, final Type type) { // TODO could be package-protected?
+    public void set(final int slotIndex, final Type type) { // TODO could be package-protected?
         if (type == Type.BYTE || type == Type.SHORT || type == Type.BOOLEAN || type == Type.CHAR) {
             throw new AssertionViolatedException("LocalVariables do not know about '"+type+"'. Use Type.INT instead.");
         }
-        locals[i] = type;
+        locals[slotIndex] = type;
     }
 
     /** @return a hash code value for the object.
@@ -118,15 +129,17 @@
     /**
      * Merges two local variables sets as described in the Java Virtual Machine Specification,
      * Second Edition, section 4.9.2, page 146.
+     *
+     * @param localVariable other local variable.
      */
-    public void merge(final LocalVariables lv) {
+    public void merge(final LocalVariables localVariable) {
 
-        if (this.locals.length != lv.locals.length) {
+        if (this.locals.length != localVariable.locals.length) {
             throw new AssertionViolatedException("Merging LocalVariables of different size?!? From different methods or what?!?");
         }
 
         for (int i=0; i<locals.length; i++) {
-            merge(lv, i);
+            merge(localVariable, i);
         }
     }
 
@@ -204,13 +217,15 @@
     }
 
     /**
-     * Replaces all occurences of u in this local variables set
+     * Replaces all occurrences of {@code uninitializedObjectType} in this local variables set
      * with an "initialized" ObjectType.
+     *
+     * @param uninitializedObjectType the object to match.
      */
-    public void initializeObject(final UninitializedObjectType u) {
+    public void initializeObject(final UninitializedObjectType uninitializedObjectType) {
         for (int i=0; i<locals.length; i++) {
-            if (locals[i] == u) {
-                locals[i] = u.getInitialized();
+            if (locals[i] == uninitializedObjectType) {
+                locals[i] = uninitializedObjectType.getInitialized();
             }
         }
     }
diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
index 5fea235..ea60415 100644
--- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
+++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
@@ -17,72 +17,74 @@
  */
 package org.apache.bcel.verifier.structurals;
 
-
 import org.apache.bcel.generic.InstructionHandle;
 
 /**
- * This interface defines properties of JVM bytecode subroutines.
- * Note that it is 'abused' to maintain the top-level code in a
- * consistent fashion, too.
- *
+ * This interface defines properties of JVM bytecode subroutines. Note that it is 'abused' to maintain the top-level
+ * code in a consistent fashion, too.
  */
-public interface Subroutine{
+public interface Subroutine {
+
     /**
-     * Returns all the JsrInstructions that have the
-     * first instruction of this subroutine as their target.
-     * <B>Must not be invoked on the 'top-level subroutine'.</B>
+     * Returns all the JsrInstructions that have the first instruction of this subroutine as their target. <B>Must not
+     * be invoked on the 'top-level subroutine'.</B>
+     *
+     * @return The JsrInstructions that have the first instruction of this subroutine as their target.
      */
     InstructionHandle[] getEnteringJsrInstructions();
 
     /**
-     * Returns the one and only RET that leaves the subroutine.
-     * Note that JustIce has a pretty rigid notion of a subroutine.
-     * <B>Must not be invoked on the 'top-level subroutine'.</B>
+     * Returns the one and only RET that leaves the subroutine. Note that JustIce has a pretty rigid notion of a
+     * subroutine. <B>Must not be invoked on the 'top-level subroutine'.</B>
+     *
+     * @return The one and only RET that leaves the subroutine.
      *
      * @see Subroutines
      */
     InstructionHandle getLeavingRET();
 
     /**
-     * Returns all instructions that together form this subroutine.
-     * Note that an instruction is part of exactly one subroutine
-     * (the top-level code is considered to be a special subroutine) -
-     * else it is not reachable at all (dead code).
+     * Returns all instructions that together form this subroutine. Note that an instruction is part of exactly one
+     * subroutine (the top-level code is considered to be a special subroutine) - else it is not reachable at all (dead
+     * code).
+     *
+     * @return All instructions that together form this subroutine.
      */
     InstructionHandle[] getInstructions();
 
     /**
-     * Returns if the given InstructionHandle refers to an instruction
-     * that is part of this subroutine. This is a convenience method
-     * that saves iteration over the InstructionHandle objects returned
-     * by getInstructions().
+     * Returns if the given InstructionHandle refers to an instruction that is part of this subroutine. This is a
+     * convenience method that saves iteration over the InstructionHandle objects returned by getInstructions().
+     *
+     * @param inst The InstructionHandle to test.
+     * @return Whether the given InstructionHandle refers to an instruction that is part of this subroutine.
      *
      * @see #getInstructions()
      */
     boolean contains(InstructionHandle inst);
 
     /**
-     * Returns an int[] containing the indices of the local variable slots
-     * accessed by this Subroutine (read-accessed, write-accessed or both);
-     * local variables referenced by subroutines of this subroutine are
-     * not included.
+     * Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed,
+     * write-accessed or both); local variables referenced by subroutines of this subroutine are not included.
      *
+     * @return An int[] containing the indices of the local variable slots.
      * @see #getRecursivelyAccessedLocalsIndices()
      */
     int[] getAccessedLocalsIndices();
 
     /**
-     * Returns an int[] containing the indices of the local variable slots
-     * accessed by this Subroutine (read-accessed, write-accessed or both);
-     * local variables referenced by subroutines of this subroutine are
-     * included.
+     * Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed,
+     * write-accessed or both); local variables referenced by subroutines of this subroutine are included.
      *
+     * @return An int[] containing the indices of the local variable slots.
      * @see #getAccessedLocalsIndices()
      */
     int[] getRecursivelyAccessedLocalsIndices();
 
     /**
      * Returns the subroutines that are directly called from this subroutine.
+     *
+     * @return The subroutines that are directly called from this subroutine.
      */
     Subroutine[] subSubs();
 }
diff --git a/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java b/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
index c55d79b..b9569c1 100644
--- a/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
+++ b/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
@@ -17,6 +17,10 @@
  */
 package org.apache.bcel;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
+import java.util.List;
+
 import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.Method;
 import org.apache.bcel.generic.ACONST_NULL;
@@ -31,13 +35,10 @@
 import org.apache.bcel.generic.Type;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.LinkedList;
-import java.util.List;
-
 public class LocalVariableTypeTableTestCase extends AbstractTestCase {
+    
     public class TestClassLoader extends ClassLoader {
+        
         public TestClassLoader(final ClassLoader parent) {
             super(parent);
         }
@@ -48,10 +49,10 @@
     }
 
     @Test
-    public void testWithGenericArguement() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
+    public void testWithGenericArguement() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
         final String targetClass = PACKAGE_BASE_NAME + ".data.SimpleClassHasMethodIncludeGenericArgument";
         final TestClassLoader loader = new TestClassLoader(getClass().getClassLoader());
-        final Class cls = loader.findClass(targetClass, getBytesFromClass(targetClass));
+        final Class<?> cls = loader.findClass(targetClass, getBytesFromClass(targetClass));
 
         java.lang.reflect.Method method = cls.getDeclaredMethod("a", String.class, List.class);
         method.invoke(null, "a1", new LinkedList<String>());
@@ -63,7 +64,7 @@
         method.invoke(null, new LinkedList<String>(), "d2");
     }
 
-    private byte[] getBytesFromClass(final String className) throws ClassNotFoundException, IOException {
+    private byte[] getBytesFromClass(final String className) throws ClassNotFoundException {
         final JavaClass clazz = getTestClass(className);
         final ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool());
 
diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java
index 66fa8b2..4ae2ace 100644
--- a/src/test/java/org/apache/bcel/PerformanceTest.java
+++ b/src/test/java/org/apache/bcel/PerformanceTest.java
@@ -133,19 +133,15 @@
 
     public void testPerformance() {
         final File javaLib = new File(System.getProperty("java.home"), "lib");
-        javaLib.listFiles(new FileFilter() {
-
-            @Override
-            public boolean accept(final File file) {
-                if(file.getName().endsWith(".jar")) {
-                    try {
-                        test(file);
-                    } catch (final IOException e) {
-                        Assert.fail(e.getMessage());
-                    }
+        javaLib.listFiles((FileFilter) file -> {
+            if(file.getName().endsWith(".jar")) {
+                try {
+                    test(file);
+                } catch (final IOException e) {
+                    Assert.fail(e.getMessage());
                 }
-                return false;
             }
+            return false;
         });
     }
 
diff --git a/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java b/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
index 028f369..2cc10af 100644
--- a/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
+++ b/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
@@ -26,7 +26,7 @@
 import org.junit.Test;
 
 public class ConstantPoolTestCase extends AbstractTestCase {
-    
+
     @Test
     public void testConstantToString() throws ClassNotFoundException {
         final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME + ".data.SimpleClassWithDefaultConstructor");
diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
index 9bf530e..b16c8e2 100644
--- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
+++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
@@ -40,19 +40,15 @@
     @Test
     public void testPerformance() throws Exception {
         final File javaLib = new File(System.getProperty("java.home") + "/lib");
-        javaLib.listFiles(new FileFilter() {
-
-            @Override
-            public boolean accept(final File file) {
-                if (file.getName().endsWith(".jar")) {
-                    try {
-                        testJar(file);
-                    } catch (final Exception e) {
-                        Assert.fail(e.getMessage());
-                    }
+        javaLib.listFiles((FileFilter) file -> {
+            if (file.getName().endsWith(".jar")) {
+                try {
+                    testJar(file);
+                } catch (final Exception e) {
+                    Assert.fail(e.getMessage());
                 }
-                return false;
             }
+            return false;
         });
     }
 
diff --git a/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
index fdf1375..d891741 100644
--- a/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
+++ b/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
@@ -68,7 +68,7 @@
  * <p>
  * For example:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dtest=JdkGenericDumpTestCase -DExtraJavaHomes="C:\Program Files\Java\openjdk\jdk-13;C:\Program Files\Java\openjdk\jdk-14"
  * </pre>
@@ -225,22 +225,12 @@
 
     private File[] listJdkJars() throws Exception {
         final File javaLib = new File(javaHome, "lib");
-        return javaLib.listFiles(new FileFilter() {
-            @Override
-            public boolean accept(final File file) {
-                return file.getName().endsWith(".jar");
-            }
-        });
+        return javaLib.listFiles((FileFilter) file -> file.getName().endsWith(".jar"));
     }
 
     private File[] listJdkModules() throws Exception {
         final File javaLib = new File(javaHome, "jmods");
-        return javaLib.listFiles(new FileFilter() {
-            @Override
-            public boolean accept(final File file) {
-                return file.getName().endsWith(".jmod");
-            }
-        });
+        return javaLib.listFiles((FileFilter) file -> file.getName().endsWith(".jmod"));
     }
 
     private void testJar(final File file) throws Exception {