diff options
Diffstat (limited to 'src/site/xdoc/manual/application-areas.xml')
-rw-r--r-- | src/site/xdoc/manual/application-areas.xml | 146 |
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<String></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<A></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 |