aboutsummaryrefslogtreecommitdiff
path: root/src/site/xdoc/manual/application-areas.xml
diff options
context:
space:
mode:
Diffstat (limited to 'src/site/xdoc/manual/application-areas.xml')
-rw-r--r--src/site/xdoc/manual/application-areas.xml146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/site/xdoc/manual/application-areas.xml b/src/site/xdoc/manual/application-areas.xml
new file mode 100644
index 00000000..2f96bca6
--- /dev/null
+++ b/src/site/xdoc/manual/application-areas.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<document>
+ <properties>
+ <title>Application areas</title>
+ </properties>
+
+ <body>
+ <section name="Application areas">
+ <p>
+ There are many possible application areas for <font
+ face="helvetica,arial">BCEL</font> ranging from class
+ browsers, profilers, byte code optimizers, and compilers to
+ sophisticated run-time analysis tools and extensions to the Java
+ language.
+ </p>
+
+ <p>
+ Compilers like the <a
+ href="http://barat.sourceforge.net">Barat</a> compiler use <font
+ face="helvetica,arial">BCEL</font> to implement a byte code
+ generating back end. Other possible application areas are the
+ static analysis of byte code or examining the run-time behavior of
+ classes by inserting calls to profiling methods into the
+ code. Further examples are extending Java with Eiffel-like
+ assertions, automated delegation, or with the concepts of <a
+ href="http://www.eclipse.org/aspectj/">Aspect-Oriented Programming</a>.<br/> A
+ list of projects using <font face="helvetica,arial">BCEL</font> can
+ be found <a href="../projects.html">here</a>.
+ </p>
+
+ <subsection name="Class loaders">
+ <p>
+ Class loaders are responsible for loading class files from the
+ file system or other resources and passing the byte code to the
+ Virtual Machine. A custom <tt>ClassLoader</tt> object may be used
+ to intercept the standard procedure of loading a class, i.e.m the
+ system class loader, and perform some transformations before
+ actually passing the byte code to the JVM.
+ </p>
+
+ <p>
+ A possible scenario is described in <a href="#Figure 7">figure
+ 7</a>:
+ During run-time the Virtual Machine requests a custom class loader
+ to load a given class. But before the JVM actually sees the byte
+ code, the class loader makes a "side-step" and performs some
+ transformation to the class. To make sure that the modified byte
+ code is still valid and does not violate any of the JVM's rules it
+ is checked by the verifier before the JVM finally executes it.
+ </p>
+
+ <p align="center">
+ <a name="Figure 7">
+ <img src="../images/classloader.gif"/>
+ <br/>
+ Figure 7: Class loaders
+ </a>
+ </p>
+
+ <p>
+ Using class loaders is an elegant way of extending the Java
+ Virtual Machine with new features without actually modifying it.
+ This concept enables developers to use <em>load-time
+ reflection</em> to implement their ideas as opposed to the static
+ reflection supported by the <a
+ href="http://java.sun.com/j2se/1.3/docs/guide/reflection/index.html">Java
+ Reflection API</a>. Load-time transformations supply the user with
+ a new level of abstraction. He is not strictly tied to the static
+ constraints of the original authors of the classes but may
+ customize the applications with third-party code in order to
+ benefit from new features. Such transformations may be executed on
+ demand and neither interfere with other users, nor alter the
+ original byte code. In fact, class loaders may even create classes
+ <em>ad hoc</em> without loading a file at all.<br/> <font
+ face="helvetica,arial">BCEL</font> has already builtin support for
+ dynamically creating classes, an example is the ProxyCreator class.
+ </p>
+
+ </subsection>
+
+ <subsection name="Example: Poor Man's Genericity">
+ <p>
+ The former "Poor Man's Genericity" project that extended Java with
+ parameterized classes, for example, used <font
+ face="helvetica,arial">BCEL</font> in two places to generate
+ instances of parameterized classes: During compile-time (with the
+ standard <tt>javac</tt> with some slightly changed classes) and at
+ run-time using a custom class loader. The compiler puts some
+ additional type information into class files (attributes) which is
+ evaluated at load-time by the class loader. The class loader
+ performs some transformations on the loaded class and passes them
+ to the VM. The following algorithm illustrates how the load method
+ of the class loader fulfills the request for a parameterized
+ class, e.g., <tt>Stack&lt;String&gt;</tt>
+ </p>
+
+ <p>
+ <ol type="1">
+ <li> Search for class <tt>Stack</tt>, load it, and check for a
+ certain class attribute containing additional type
+ information. I.e. the attribute defines the "real" name of the
+ class, i.e., <tt>Stack&lt;A&gt;</tt>.</li>
+
+ <li>Replace all occurrences and references to the formal type
+ <tt>A</tt> with references to the actual type <tt>String</tt>. For
+ example the method
+ </li>
+
+ <source>
+ void push(A obj) { ... }
+ </source>
+
+ <p>
+ becomes
+ </p>
+
+ <source>
+ void push(String obj) { ... }
+ </source>
+
+ <li> Return the resulting class to the Virtual Machine.</li>
+ </ol>
+ </p>
+
+ </subsection>
+ </section>
+ </body>
+</document> \ No newline at end of file