http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html


<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   
      <meta content="Percussion Rhythmyx" name="generator">
      <title>Explore the Dynamic Proxy API - Java World</title>
      
      <script language="JavaScript">
			var topicid = 1; 
		    subtopicid = 98; 
		</script><script>
			function HighlightText(divid){
			var code = document.body.createTextRange();
			code.moveToElementText(document.getElementById('codewrap' + divid));
			code.execCommand("SelectAll");
			code.execCommand("Copy");
			} 
		</script><meta name="TopicID" content="1">
      <meta name="SubTopicID" content="98">
      <meta name="channels" content="Java World">
      <meta name="description" content="In Java 1.3, Sun introduced the Dynamic Proxy API, which can&#xA;basically mimic any interface. Add that to an abstract data model,&#xA;and you can conform any loosely typed data to a strongly typed&#xA;interface. This article discusses some of the Dynamic Proxy API's&#xA;many benefits.">
      <meta name="keywords" content="Java Standard Edition,proxy, proxies, dynamic proxies, Java 1.3, Dynamic Proxy API">
      <meta name="contenttype" content="News">
      <meta name="publicationDate" content="2000-11-10">
      <meta name="author" content="Jeremy Blosser">
      <meta name="publisher" content="JavaWorld.com">
      
      
      
      
      
      
      
      
      
      <meta http-equiv="expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />



	










  



  




<!-- SSI Error -->


		


<!-- put the # sign in the comment below to go live -->




<style>#reg{BACKGROUND: #ebe7d9;PADDING:5px;}</style>
<script language="javascript">
  var outerref = new String("(none)");
  var nwchannel = 'jw';
  var refresh = 0;
</script>
<base target = "_top">
<script src="/includes/head-scripts.js"></script>

<!-- HBX -->
<script language="javascript1.1">
var _hbEC=0,_hbE=new Array;function _hbEvent(a,b){b=_hbE[_hbEC++]=new Object();b._N=a;b._C=0;return b;}
var hbx=_hbEvent("pv");hbx.vpc="HBX0103u";hbx.gn="a.javaworld.com";
var doctitle = hbxStrip(document.title);
var loc = new String(document.location.href);
loc = hbxStrip(loc);

hbx.acct="DM54120129AB;DM550210NGWB";
hbx.pn="PUT+PAGE+NAME+HERE";
hbx.mlc="CONTENT+CATEGORY";
hbx.pndef="title";
hbx.ctdef="full";
hbx.lvm="300";
hbx.lidt="txl";

hbx.fv="";//FORM VAL MIN
hbx.lt="auto"; //LINK TR
hbx.dlf="n";//Dl FILTER
hbx.dft="n";//Dl FILE NAMING
hbx.elf="n";//EXIT LINK FILTER

hbx.seg="-1";
hbx.ci="";
hbx.hc1="jw_core|";
hbx.hc2=keywords+"|"+doctitle;
hbx.hc3=author+"|"+doctitle;
hbx.hc4=doctitle+"|"+author;
hbx.pec="";//ERROR CODES
</script><script language="javascript1.1" src="/includes/hbx.js"></script>
<!--END HBX -->

<!--
channels: jw
keywords (topics): Java Standard Edition
contenttype (tasks): News
site: jw_core
pagename: core
keyval: core
ibsearch: (none)
-->

	 

      <link href="/includes/styles/adstyles.css" rel="stylesheet" type="text/css">
      <link href="/includes/styles/jw-main.css" rel="stylesheet" type="text/css">
   </head>
   <body onload="init()">
      
      <!--stopindex-->
      
      <div id="wrapper">
         <div id="bannerarea">
            <div id="mainbanner">
               



<script> bannersrc = "http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=top;sz=728x90;ptile=1;type=news;ord=014834?";</script>
<!--stopindex-->
<!-- begin ad tag -->
<NOLAYER>
<IFRAME id="banner" src="http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=top;sz=728x90;ptile=1;type=news;ord=014834?" width="728" height="90" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no">
<A href="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;abr=!ie;pos=top;sz=728x90;ptile=1;type=news;ord=014834?">
<IMG src="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;abr=!ie;pos=top;sz=728x90;ptile=1;type=news;ord=014834?" border="0" width="728" height="90"></A>
</IFRAME>
</NOLAYER>
<ILAYER id="banner" visibility="hidden" width="728" height="90"></ILAYER>
<!-- end ad tag -->


            </div>
            <div class="separator">
               <!-- xxxxxxxxxxxxxx -->
            </div>
            <div id="masthead">
               <div id="logoarea">
                  <a href="http://www.javaworld.com"><img src="/images/jw-logo.gif" alt="JavaWorld" width="201" height="58" border="0" /></a>
               </div>
                 <div id="searcharea"><form method="get" accept-charset="iso-8859-1" action="http://www.javaworld.com/ifind/java/query.html"><input type=hidden name="qm" value="0" />
<input type=hidden name="st" value="1" />
<input type=hidden name="nh" value="10" />
<input type="hidden" name="col" value="java" />
  <table border="0" cellspacing="0" cellpadding="0">
  <tr valign="top">
    <td><input type="text" name="qt" class="formfield" value="" maxlength="1991"></td>
    <td><input class="submit" name="" type="image" src="/includes/styles/i/but/lw-search-button.gif" alt="Search" value="Go" /></td>
    <td><span><a href="http://www.javaworld.com/ifind/java/query.html?col=java&qs=&qc=&si=0&ql=a&nh=25&lk=1&rf=0">Advanced search</a></span></td>
  </tr>
</table>
  </form>
</div>

            </div>
            <div class="separator">
               <!-- xxxxxxxxxxxxxx -->
            </div>
         </div>
         <!--Start Menu--><script language="javascript" src="/includes/lookup_topic.js" xml:space="preserve"> </script><div id="toolbar"><img height="15" src="/images/jw-logo-tagline.gif" width="125"/><div id="medallion"><!-- begin ad tag -->

<table width="125"  border="0" cellspacing="0" cellpadding="0"><tr><td><SCRIPT LANGUAGE="JavaScript1.1" SRC="http://ad.doubleclick.net/adj/idg.us.nwf.jw_core/;pos=n1;sz=120x90;ptile=2;type=news;ord=014834?" ></SCRIPT></td></tr></table>
<script>
if ((!document.images && navigator.userAgent.indexOf("Mozilla/2.") >= 0)  || navigator.userAgent.indexOf("WebTV")>= 0) {
document.write('<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=n1;sz=120x90;ptile=2;type=news;ord=014834?" TARGET="_blank">');
document.write('<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=n1;sz=120x90;ptile=2;type=news;ord=014834?" WIDTH="120" HEIGHT="90" BORDER="0" ALT="Click Here"></A>');
}
</script>
<NOSCRIPT>
<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=n1;sz=120x90;ptile=2;type=news;ord=014834?" TARGET="_blank">
<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=n1;sz=120x90;ptile=2;type=news;ord=014834?" WIDTH="120" HEIGHT="90" BORDER="0" ALT="alt text">Click Here</A>
</NOSCRIPT>
<!-- end ad tag --><div></div></div><div id="toolbarhome"><ul><li id="hmbar" class=""><a href="/index.html" shape="rect">Home</a></li></ul></div><ul><li class="research"><a href="/topics/index.html" shape="rect">Research Centers</a></li></ul><div id="toolbar_rc"><ul class="botbar"><li id="navbar1" class="nobracket"><a shape="rect" id="linknav1" href="/channel_content/jw-core-index.html" class=""><span id="showplus1" class="toolbar-red">
			+ </span>Java Standard Edition</a><div id="toolbar_rcsubs1"><ul><li id="subnav98" class=""><a shape="rect" href="/channel_content/jw-apis-index.html">APIs</a></li><li id="subnav105" class=""><a shape="rect" href="/channel_content/jw-awt-index.html">AWT / Swing</a></li><li id="subnav108" class=""><a shape="rect" href="/channel_content/jw-patterns-index.html">Design Patterns</a></li><li id="subnav37" class=""><a shape="rect" href="/channel_content/jw-ui-index.html">User Interface Design</a></li><li id="subnav13" class=""><a shape="rect" href="/channel_content/jw-jdbc-index.html">Java Database Connectivity (JDBC)</a></li><li id="subnav103" class=""><a shape="rect" href="/channel_content/jw-jvm-index.html">Java Virtual Machine (JVM)</a></li><li id="subnav65" class=""><a shape="rect" href="/columns/jw-qna-index.html">Java Q&amp;A</a></li><li id="subnav57" class=""><a shape="rect" href="/columns/jw-tips-index.html">Java Tips</a></li></ul></div></li><li id="navbar2" class="nobracket"><a shape="rect" id="linknav2" href="/channel_content/jw-enterprise-index.html" class=""><span id="showplus2" class="toolbar-red">
			+ </span>Java Enterprise Edition</a><div id="toolbar_rcsubs2"><ul><li id="subnav8" class=""><a shape="rect" href="/channel_content/jw-ejbs-index.html">Enterprise JavaBeans (EJBs)</a></li><li id="subnav16" class=""><a shape="rect" href="/channel_content/jw-message-index.html">Java Message Service</a></li><li id="subnav14" class=""><a shape="rect" href="/channel_content/jw-jsp-index.html">JavaServer Pages</a></li><li id="subnav19" class=""><a shape="rect" href="/channel_content/jw-servlets-index.html">Servlets</a></li><li id="subnav9" class=""><a shape="rect" href="/channel_content/jw-webserv-index.html">Web Services and SOAs</a></li><li id="subnav10" class=""><a shape="rect" href="/channel_content/jw-xml-index.html">Java and XML</a></li><li id="subnav30" class=""><a shape="rect" href="/channel_content/jw-design-index.html">Design Patterns</a></li><li id="subnav31" class=""><a shape="rect" href="/channel_content/jw-performance-index.html">Performance Tuning</a></li></ul></div></li><li id="navbar3" class="nobracket"><a shape="rect" id="linknav3" href="/channel_content/jw-micro-index.html" class=""><span id="showplus3" class="toolbar-red">
			+ </span>Java Micro Edition</a><div id="toolbar_rcsubs3"><ul/></div></li><li id="navbar4" class="nobracket"><a shape="rect" id="linknav4" href="/channel_content/jw-applied-index.html" class=""><span id="showplus4" class="toolbar-red">
			+ </span>Development Tools</a><div id="toolbar_rcsubs4"><ul><li id="subnav38" class=""><a shape="rect" href="/channel_content/jw-amt-index.html">Application Management</a></li><li id="subnav41" class=""><a shape="rect" href="/channel_content/jw-dataaccesstools-index.html">Data Access Tools</a></li><li id="subnav44" class=""><a shape="rect" href="/channel_content/jw-gamingtools-index.html">Gaming Tools</a></li><li id="subnav21" class=""><a shape="rect" href="/channel_content/jw-webdev-index.html">Web Development Frameworks</a></li><li id="subnav110" class=""><a shape="rect" href="/channel_content/jw-security-testing-index.html">Security &amp; Testing</a></li><li id="subnav12" class=""><a shape="rect" href="/channel_content/jw-appserv-index.html">Java Application Servers</a></li><li id="subnav48" class=""><a shape="rect" href="/channel_content/jw-profilingtools-index.html">Profiling and Monitoring</a></li><li id="subnav49" class=""><a shape="rect" href="/channel_content/jw-reportingtools-index.html">Reporting</a></li></ul></div></li></ul></div> <!-- use li class=current1 to hightlight the items below-->
    <ul class="botbar">
      <li class="toplevel2"><a href="/resources/site-resources.html">Site Resources</a></li>
      <li id="sr87" class=""><a href="/features/index.html">Featured Tutorials</a></li>
	  <li id="sr89" class=""><a href="/news-reviews/index.html">News &amp; Reviews</a></li>
	  <li id="sr990" class=""><a href="/javaforums/ubbthreads.php?Cat=2&C=2">Forum</a></li>
      <li id="sr991" class=""><a href="/newsletter/">Newsletters</a></li>
      <li id="sr95" class=""><a href="/white-paper/index.html">White Paper Library</a></li>
      <li id="sr199" class=""><a href="/resources/index.html">Web resources</a></li>
      <li id="sr992" class=""><a href="/rss/index.html">RSS Feeds</a></li>
    </ul>
	 <ul class="botbar">
      <li class="toplevel2"><a href="http://javaworld.4jobs.com">Careers</a></li>
    </ul>
    <div class="toolspace">
      <!--3px of space-->
    </div>
    <ul class="botbar">
      <li class="toplevel2"><a href="/partners.html">Partner Sites</a></li>
      <li><a href="http://www.demo.com">Demo.com</a></li>
	  <li><a href="http://www.linuxworld.com">LinuxWorld.com</a></li>
      <li><a href="http://www.networkworld.com">NetworkWorld.com</a></li>  
    </ul>
	<ul><li class="toplevel2"><a href="/info/jw-about-index.html">About Us</a></li>
	</ul>
	<script language="javascript">if (typeof menu_lookup == "function") menu_lookup();</script>
	<br>
	<div id="techwords" style="background-color:#FFFFFF;">
	<h6>sponsored links</h6>
		<a href="http://www.techwords.com/">See your link here.</a>
		<script type="text/javascript">
		adsonar_placementId=1268728;
		adsonar_pid=462761;
		adsonar_ps=1424789;
		adsonar_zw=120;
		adsonar_zh=600;
		adsonar_jv='ads.adsonar.com';
		</script>
		<script language="JavaScript" src="http://js.adsonar.com/js/adsonar.js"></script>
	</div>
	</div>
         <div class="rc" id="contentarea">
            <div id="rcheader">
               <!--startindex-->
               <div id="toptabs">
                  <ul>
                     <li><a href="/channel_content/jw-core-index.html">Java Standard Edition</a></li>
                  </ul>
               </div>
               <!--stopindex-->
            </div>
            <div id="idglogin">
               <!-- xxxxxxxxxxxxxx -->
            </div>
            <div id="sectionhome">
               <div id="a-e_col1">
                  <div id="d-e_col2b">
                     <div id="d-e-1">
	<div id="tabs">
		<ul>
		<li class="ts"><a href="javascript:opentab('topstories');" class="ts" id="topstories_a">Top 5 Stories</a></li>
		<li class="saved"><a href="javascript:opentab('savedarticles');" class="saved" id="savedarticles_a">Editor's Choice</a></li>
		</ul>
	</div>
	<div id="topstories">
		 <p><a href="http://www.javaworld.com/javaworld/jw-03-2007/jw-0305-jobs.html">High-impact tech talent in high demand</a><br><a href="http://www.javaworld.com/javaworld/jw-03-2007/jw-0327-ides.html">Reinvigorated Java IDEs change the development landscape</a><br><a href="http://www.javaworld.com/javaworld/jw-03-2007/jw-03-jxpath.html">Java object queries using JXPath</a></p>
<p><b>From the archives:</b></p>
<p><a href="http://www.javaworld.com/javaworld/jw-07-1999/jw-07-toolbox.html">Building user interfaces for object-oriented systems</a><br><a href="http://www.javaworld.com/javaworld/jw-10-2000/jw-1020-ant.html">Automate your build process using Java and Ant</a></p>
	</div>
	<div id="savedarticles">
		 <p><b>More on gird computing:</b></p>
<p><a href="http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-grid.html">A do-it-yourself framework for grid computing</a><br><a href="http://www.javaworld.com/javaworld/jw-08-2004/jw-0802-grid.html">Achieve bottleneck-free grid applications</a></p>
	</div>
</div>

<script type="text/javascript">
divnames = new Array('topstories', 'savedarticles'); <!--,'topstories'-->
opentab("topstories");

function opentab(divname) {	;
	if(document.getElementById(divname)) {
		for (i=0;i < 2;i++) {	<!-- 2-->
			var aname = divnames[i] + '_a';		
			if (divnames[i] == divname)	{	
				tab=divname;		    
				document.getElementById(divname).style.display='block';
				document.getElementById(aname).parentNode.id = "current";	
			}
			else {
				document.getElementById(divnames[i]).style.display='none';
				document.getElementById(aname).parentNode.id = "none";
			}
		}
	}
}
</script>


                     <div class="imu">
                        <!--stopindex-->







<script language="JavaScript">
<!--
var imuvar;
myImage = new Image();
myImagef = new Image();
function resize(){
	//return; //just comment this out to activate the resize function
	imuvar = document.getElementById("imu");
	myImage.src = "http://www.javaworld.com/ads/halfpage.jsp?get=true&ord=014834";
	setTimeout("getSize()",300);
	setTimeout("finalSize()",1200);
}

function finalSize(){
	if (imuvar.height < 600) {
		imuvar = document.getElementById("imu");
		myImagef.src = "http://www.javaworld.com/ads/halfpage.jsp?get=true&ord=1014834";
		getSizef();
	}
}

function getSizef() {
    if (myImagef.height == 0) setTimeout("getSizef()",200);	
	if (myImagef.height == 600) imuvar.height=600;
}

function getSize() {
    if (myImage.height == 0) setTimeout("getSize()",200);	
	if (myImage.height == 600) imuvar.height=600;
}
//-->
</script>
  
  <NOLAYER>
  <IFRAME id="imu" src="http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=imu;sz=336x280;ptile=3;type=news;ord=014834?" onload="resize()" width="336" height="280" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no">
  <A href="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;abr=!ie;pos=imu;sz=336x280;ptile=3;type=news;ord=014834?">
  <IMG src="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;abr=!ie;pos=imu;sz=336x280;ptile=3;type=news;ord=014834?" border="0" width="336" height="280"></A>
  </IFRAME>
  </NOLAYER>
  <ILAYER id="imu" visibility="hidden" width="336" height="280"></ILAYER>
	<script> imusrc = "http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=imu;sz=336x280;ptile=3;type=news;ord=";</script>

                     </div>
                     <!--Featured White Papers--><div id="de3"><h2>Featured White Papers</h2><ul><li><a href="http://adserver.fattail.com/redir/redirect.asp?CID=216050" target="_blank" onclick="" title=" Apache Tomcat and Terracotta Session Clustering Comparison and Real-world Benchmarks"> Apache Tomcat and Terracotta Session Clustering Comparison and Real-world Benchmarks</a></li><li><a href="http://adserver.fattail.com/redir/redirect.asp?CID=216053" target="_blank" onclick="" title="Jaxcent:  AJAX in Java.  No JavaScript.">Jaxcent:  AJAX in Java.  No JavaScript.</a></li><li><a href="http://adserver.fattail.com/redir/redirect.asp?CID=214803" target="_blank" onclick="" title="A Dashboard Data Methodology: Five Key Steps to Properly Organize Data for a Dashboard Project">A Dashboard Data Methodology: Five Key Steps to Properly Organize Data for a Dashboard Project</a></li><li><a href="http://adserver.fattail.com/redir/redirect.asp?CID=214281" target="_blank" onclick="" title="Enterprise AJAX - Transcend the Hype">Enterprise AJAX - Transcend the Hype</a></li><li><a href="http://adserver.fattail.com/redir/redirect.asp?CID=212416" target="_blank" onclick="" title="An Introduction to Open Terracotta">An Introduction to Open Terracotta</a></li></ul></div>
                             <!-- nl signup start-->
		<form action="http://www.subscribenw.com/nl/Signup.do" id="Form2" method="post" name="form" onSubmit="openNewWindow()" target="new_window">
          <div id="newsletter">
            <h5>Newsletter sign-up</h5>
			<p class="nl">Sign up for our technology specific newsletters.</p>
            <table width="300" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td width="27" valign="top" class="bgleft"><input name="NL70" type="checkbox" id="NL70"/></td>
                <td width="265" class="bgright"><a href="javascript:openWindow('http://www.subscribenw.com/nl/popup.jsp?id=70',500,300);">Enterprise Java</a></td>
              </tr>
			  <tr><td colspan="2"><a href="http://www.subscribenw.com/nl/signup.jsp?keycode=JW07">View all newsletters</a></td></tr>
		    </table>
            <hr color="#CCCCCC" noshade="noshade" size="1"/>
            <strong>Email Address:</strong>
			<input id="keycode" name="keycode" type="hidden" value="NLmsu08"/>
			<input id="call" name="call" type="hidden" value="instant"/>
			<input name="pid" type="hidden" value="121"/>
			<input name="email" size="14" type="text"/>
            <input alt="Submit" name="Button" type="submit" value="Subscribe" id="Submit1"/>
          </div>
        </form>

                     <!--include virtual="/includes/topic/core-nl-signup.html"-->
                     
<div id="de5">
<!-- begin ad tag -->
<SCRIPT LANGUAGE="JavaScript1.1" SRC="http://ad.doubleclick.net/adj/idg.us.nwf.jw_core/;pos=de5;sz=336x175;tile=5;ord=014834?" ></SCRIPT>
<script>
if ((!document.images && navigator.userAgent.indexOf("Mozilla/2.") >= 0)  || navigator.userAgent.indexOf("WebTV")>= 0) {
document.write('<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=de5;sz=336x175;tile=5;ord=014834?" TARGET="_blank">');
document.write('<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=de5;sz=336x175;tile=5;ord=014834?" WIDTH="336" HEIGHT="175" BORDER="0" ALT="Click Here"></A>');
}
</script>
<NOSCRIPT>
<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=de5;sz=336x175;tile=5;ord=014834?" TARGET="_blank">
<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=de5;sz=336x175;tile=5;ord=014834?" WIDTH="336" HEIGHT="175" BORDER="0" ALT="alt text">Click Here</A>
</NOSCRIPT>
<!-- end ad tag -->
</div>

                  </div>
                  <div class="breadcr"><a href="/index.html">JavaWorld.com</a>
                     &gt; <a href="/channel_content/jw-core-index.html">Java Standard Edition</a> &gt;</div>
                  <div>
                     
                     <!--HEADLINE GOES HERE-->
                     
                     <!--startindex-->
                     <a id="top" name="top"></a><h1>Explore the Dynamic Proxy API</h1>
                     <H3>Use dynamic proxies to bring strong typing to abstract data types</H3>
                     <p class="byline">By&nbsp;Jeremy Blosser,&nbsp;JavaWorld.com,&nbsp;11/10/00</p>
                     
                     <!-- CONTENT GOES HERE-->
                     


With the introduction of the Dynamic Proxy API in Java 1.3, a huge and often overlooked improvement has been made to the Java
                     platform. The uses for dynamic proxies are sometimes hard concepts to grasp. In this article, I hope to introduce you first
                     to the Proxy design pattern and then to the <code>java.lang.reflect.Proxy</code> class and the <code>java.lang.reflect.InvocationHandler</code> interface, which make up the heart of Dynamic Proxy's functionality.<br><br> 
                     <p class="first">The functionality discussed here combines the Java 1.3 dynamic proxies with abstract data types to bring strong typing to
                        those types. I will also discuss the power of the dynamic proxy by introducing the concept of <em>views</em> in your Java programming. Lastly, I will introduce a powerful way to add access control to your Java objects with, of course,
                        the use of the dynamic proxy.
                     </p>
                     <h3>Definition of a proxy</h3>A proxy forces object method calls to occur indirectly through the proxy object, which acts as a surrogate or delegate for
                     the underlying object being proxied. Proxy objects are usually declared so that the client objects have no indication that
                     they have a proxy object instance.<br><br> 
                     <p>Some common proxies are the access proxy, facades, remote proxies, and virtual proxies. An access proxy is used to enforce
                        a security policy on access to a service or data-providing object. A facade is a single interface to multiple underlying objects.
                        The remote proxy is used to mask or shield the client object from the fact that the underlying object is remote. A virtual
                        proxy is used to perform lazy or just-in-time instantiation of the real object.
                     </p>
                     <p>The proxy is a fundamental design pattern that is used quite often in programming. However, one of its drawbacks is the specificity
                        or tight coupling of the proxy with its underlying object. Looking at the UML for the Proxy design pattern in Figure 1, you
                        see that for the proxy to be useful and transparent, it usually needs to either implement an interface or inherit from a known
                        superclass (with the exception of a facade, perhaps).
                     </p>
                     <p><img height="277" src="images/jw-1110-proxy.gif" width="414"></p>
                     <p><strong>Figure 1. UML Diagram of the Proxy Design Pattern</strong></p><br><br> 
                     <h3>Dynamic proxies</h3>In Java 1.3, Sun introduced the Dynamic Proxy API. For the dynamic proxy to work, you must first have a proxy interface. The
                     proxy interface is the interface that is implemented by the proxy class. Second, you need an instance of the proxy class.<br><br> 
                     <p>Interestingly, you can have a proxy class that implements multiple interfaces. However, there are a few restrictions on the
                        interfaces you implement. It is important to keep those restrictions in mind when creating your dynamic proxy:
                     </p>
                     <ol>
                        <li>The proxy interface must be an interface. In other words, it cannot be a class (or an abstract class) or a primitive.</li>
                        <li>The array of interfaces passed to the proxy constructor must not contain duplicates of the same interface. Sun specifies that,
                           and it makes sense that you wouldn't be trying to implement the same interface twice at the same time. For example, an array
                           <code>{ IPerson.class, IPerson.class }</code> would be illegal, but the code <code>{ IPerson.class, IEmployee.class }</code> would not. The code calling the constructor should check for that case and filter out duplicates.
                        </li>
                        <li>All the interfaces must be visible to the <code>ClassLoader</code> specified during the construction call. Again, that makes sense. The <code>ClassLoader</code> must be able to load the interfaces for the proxy.
                        </li>
                        <li>All the nonpublic interfaces must be from the same package. You cannot have a private interface from package <code>com.xyz</code> and the proxy class in package <code>com.abc</code>. If you think about it, it is the same way when programming a regular Java class. You couldn't implement a nonpublic interface
                           from another package with a regular class either.
                        </li>
                        <li>The proxy interfaces cannot have a conflict of methods. You can't have two methods that take the same parameters but return
                           different types. For example, the methods <code>public void foo()</code> and <code>public String foo()</code> cannot be defined in the same class because they have the same signature, but return different types (see <a href="#resources"><em>The Java Language Specification</em></a>). Again, that is the same for a regular class.
                        </li>
                        <li>The resulting proxy class cannot exceed the limits of the VM, such as the limitation on the number of interfaces that can
                           be implemented.
                        </li>
                     </ol><br><br> 
                     <p>To create an actual dynamic proxy class, all you need to do is implement the <code>java.lang.reflect.InvocationHandler</code> interface:
                     </p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(42);"></div>
                     <div id="codewrap">
                        <div id="codewrap42"><pre>public Class MyDynamicProxyClass implements
java.lang.reflect.InvocationHandler
{
  Object obj;
  public MyDynamicProxyClass(Object obj)
  { this.obj = obj; }
  public Object invoke(Object proxy, Method m, Object[] args) throws
Throwable
  {
    try {
      // do something
    } catch (InvocationTargetException e) {
      throw e.getTargetException();
    } catch (Exception e) {
      throw e;
    }
    // return something
  }
}
</pre></div>
                     </div><br><br> 
                     <p>That's all there is to it! Really! I'm not lying! Okay, well, you also have to have your actual proxy interface:</p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(46);"></div>
                     <div id="codewrap">
                        <div id="codewrap46"><pre>public interface MyProxyInterface
{
  public Object MyMethod();
}
</pre></div>
                     </div><br><br> 
                     <p>Then to actually use that dynamic proxy, the code looks like this:</p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(50);"></div>
                     <div id="codewrap">
                        <div id="codewrap50"><pre>MyProxyInterface foo = (MyProxyInterface)
java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                                         Class[] { MyProxyInterface.class },
                                         new MyDynamicProxyClass(obj));
</pre></div>
                     </div><br><br> 
                     <p>Knowing that the above code is just horribly ugly, I'd like to hide it in some type of factory method. So instead of having
                        that messy code in the client code, I'll add that method to my <code>MyDynamicProxyClass</code>:
                     </p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(55);"></div>
                     <div id="codewrap">
                        <div id="codewrap55"><pre>static public Object newInstance(Object obj, Class[] interfaces)
{
  return
java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                                                  interfaces,
                                                  new
MyDynamicProxyClass(obj));
}
</pre></div>
                     </div><br><br> 
                     <p>That allows me to use the following client code instead:</p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(59);"></div>
                     <div id="codewrap">
                        <div id="codewrap59"><pre>MyProxyInterface foo = (MyProxyInterface)
  MyDynamicProxyClass.newInstance(obj, new Class[]
{ MyProxyInterface.class });
</pre></div>
                     </div><br><br> 
                     <p>That is much cleaner code. It might be a good idea in the future to have a factory class that completely hides the entire
                        code from the client, so that the client code looks more like:
                     </p>
                     <div id="codebutton"><input type="button" name="btn" value="Copy to Clipboard" onClick="HighlightText(63);"></div>
                     <div id="codewrap">
                        <div id="codewrap63"><pre>MyProxyInterface foo = Builder.newProxyInterface();
</pre></div>
                     </div><br><br> 
                     <p>Overall, implementing a dynamic proxy is fairly simple. However, behind that simplicity is great power. That great power is
                        derived from the fact that your dynamic proxy can implement any interface or interface group. I'll explore that concept in
                        the next section.
                        &nbsp;&nbsp;<a href="?page=2">Continued</a>
                     </p>




									 
									 	 <div id="pagenum"><hr size="1"><script src="/includes/nextlink.js"></script>1 | <a href="/javaworld/jw-11-2000/jw-1110-proxy.html?page=2" class="noline"><strong>2</strong></a> | <a href="/javaworld/jw-11-2000/jw-1110-proxy.html?page=3" class="noline"><strong>3</strong></a> | <a href="/javaworld/jw-11-2000/jw-1110-proxy.html?page=4" class="noline"><strong>4</strong></a> | &nbsp;<a href="/javaworld/jw-11-2000/jw-1110-proxy.html?page=2" class="noline"><strong>Next&nbsp;></strong></a></div>
									 
                     
                     <!-- CONTENT ENDS HERE -->
                     
                     <!--stopindex-->
                     
                     
<!-- mypages:  -->
<!--story tools start-->
<script>
<!--
function MM_jumpMenu(targ,selObj,restore){ //v3.0
var test = "/adtran/solutionDetails.jsp?subject="
eval(targ+".location='"+test+"'+'"+selObj.options[selObj.selectedIndex].value+"'")
  if (restore) selObj.selectedIndex=0;
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
//-->
</script>
				<div id="storytools">
	      			<ul>
					  	<form method="post" name="print" action="/cgi-bin/mailto/x_java.cgi">
<input type="hidden" name="pagetosend" value="/export/home/httpd/javaworld/javaworld/jw-11-2000/jw-1110-proxy.html" />
<input type="hidden" name="pagename" value="/javaworld/jw-11-2000/jw-1110-proxy.html" />
<input type="hidden" name="pageurl" value="http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html" />
<input type="hidden" name="site" value="jw_core" /><li><input type="image" title="print" src="/includes/styles/i/ico/print06-icon.gif" class="printer" alt="print" width="18" height="13" border="0" />
						<a href="javascript:document.forms.print.submit();">Print</a>
						</li> 
						</form>			  
						<li><img src="/includes/styles/i/ico/email-06-icon.gif" width="17" height="13" /><a href="javascript:;" onClick="MM_openBrWindow('/mailto/mailform.jsp?refpage=jw&pagetosend=/export/home/httpd/javaworld/javaworld/jw-11-2000/jw-1110-proxy.html&pagename=/javaworld/jw-11-2000/jw-1110-proxy.html&pageurl=/javaworld/jw-11-2000/jw-1110-proxy.html','Registration','scrollbars=yes,resizable=yes,width=510,height=500')">E-Mail article </a></li>			  
						<li><img src="/includes/styles/i/ico/fdbck06-icon.gif" width="14" height="13" /><a href="javascript:;" onClick="MM_openBrWindow('/askTheExpert.jsp?pagename=http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html&pagename=/javaworld/jw-11-2000/jw-1110-proxy.html&pageurl=/javaworld/jw-11-2000/jw-1110-proxy.html&pubsite=j','Registration','scrollbars=yes,resizable=yes,width=500,height=600')">Feedback</a></li>
						<li><img src="/includes/styles/i/ico/add-icon.gif" width="14" height="14" /><a href="javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)">Add to del.icio.us</a></li>
						<li class="next"><script src="/includes/nextlink.js"></script></li>						
					</ul>
				</div>
   <div class="separatorzero">
          <!-- xxxxxxxxxxxxxx -->
        </div>
        <!--story tools end--><a name="resources"></a><strong>Resources</strong><br><externallinks no-escaping="yes">
                        <div class="rxbodyfield">
                           <ul>
                              <li>"Dynamic Proxy Classes" (java.sun.com)<br><a href="http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html">http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html</a></li>
                              <li>"Using Dynamic Proxies to Layer New Functionality Over Existing Code" (java.sun.com Tech Tips)<br><a href="http://developer.java.sun.com/developer/TechTips/2000/tt0530.html#tip1">http://developer.java.sun.com/developer/TechTips/2000/tt0530.html#tip1</a></li>
                              <li>"Using Dynamic Proxies to Layer New Functionality Over Existing Code" (java.sun.com Tech Tips)<br><a href="http://developer.java.sun.com/developer/TechTips/2000/tt0530.html#tip1">http://developer.java.sun.com/developer/TechTips/2000/tt0530.html#tip1</a></li>
                              <li>"Innovative Ways to Handle Events in AWT and JFC," Satheesh Donthy (<em>JavaWorld,</em> Nov. 1999)<br><a href="http://www.javaworld.com/javaworld/jw-11-1999/jw-11-events.html">http://www.javaworld.com/javaworld/jw-11-1999/jw-11-events.html</a></li>
                              <li>The Patterns homepage<br><a href="http://www.hillside.net/patterns/">http://www.hillside.net/patterns/</a></li>
                              <li><em>The Java Language Specification</em><br><a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#38649">http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#38649</a></li>
                              <li><em>Design PatternsElements of Reusable Object-Oriented Software,</em> Erich Gamma, et al. (Addison-Wesley, 1995)<br><a href="http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld">http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld</a></li>
                              <li><em>Patterns in Java, Volume 1,</em> Mark Grand (John Wiley &amp; Sons, 1998)<br><a href="http://www.amazon.com/exec/obidos/ASIN/0471258393/javaworld">http://www.amazon.com/exec/obidos/ASIN/0471258393/javaworld</a></li>
                              <li><em>Patterns in Java, Volume 2,</em> Mark Grand (John Wiley &amp; Sons, 1999)<br><a href="http://www.amazon.com/exec/obidos/ASIN/0471258415/javaworld">http://www.amazon.com/exec/obidos/ASIN/0471258415/javaworld</a></li>
                              <li>"JavaTip 98Reflect on the Visitor Design Pattern," Jeremy Blosser (<em>JavaWorld</em>)<br><a href="http://www.javaworld.com/javatips/jw-javatip98.html">http://www.javaworld.com/javatips/jw-javatip98.html</a></li>
                           </ul>
                        </div>
                     </externallinks><br>
                     
</div>
               </div>
               
		<HTML><HEAD><META http-equiv=Pragma content=no-cache></HEAD>
<BODY>
<DIV class=box02>
<DIV id=box_cis>
<H5 class=cistrip>Partner Content</H5>
<TABLE cellSpacing=0 cellPadding=0 width="99%" bgColor=#faf8e8 border=0>
<TBODY>
<TR>
<TD vAlign=top width="25%">
<DIV align=center><!--1ST COLUMN OF CONTENT --><!-- maximum image dimension 175x50 --><IMG height=50 src="http://www.networkworld.com/cis/ibm_j559/ibm_logo.gif" width=135 border=0></DIV>
<H3 style="COLOR: #ab0538">Open Source Software Solutions </H3>
<P>Explore a universal platform of frameworks for open source on eclipse solutions coming on April 5, 2007. </P>
<P><A href="http://adserver.fattail.com/redir/redirect.asp?CID=202552" target=_blank>Continuum of open source </A></P></TD>
<TD vAlign=top width="25%">
<DIV align=center><!--2ND COLUMN OF CONTENT --><!-- maximum image dimension 175x50 --><IMG height=50 src="http://www.networkworld.com/cis/ibm_j559/ibm_websvcs.gif" width=165 border=0> </DIV>
<H3 style="COLOR: #ab0538">Build Secure Web Services </H3>
<P>Discover how to authenticate using a user ID and password, ensure integrity using digital signatures, and ensure confidentiality using encryption.</P>
<P><A href="http://adserver.fattail.com/redir/redirect.asp?CID=202553" target=_blank>Build your services now</A></P></TD>
<TD vAlign=top width="25%">
<DIV align=center><!--3RD COLUMN OF CONTENT --><!-- maximum image dimension 175x50 --><IMG height=50 src="http://www.networkworld.com/cis/ibm_j559/ibm_ratlsw_logo.gif" width=165 border=0> </DIV>
<H3 style="COLOR: #ab0538">Rational V7 Downloads</H3>
<P>Test-drive the IBM Rational V7 desktop products offering new capabilities for empowering global teams to speed SOA results.</P>
<P><A href="http://adserver.fattail.com/redir/redirect.asp?CID=202551" target=_blank>Free Rational trials </A></P></TD>
<TD class=end vAlign=top width="25%">
<DIV align=center><!--4TH COLUMN OF CONTENT --><!-- maximum image dimension 175x50 --><IMG height=50 src="http://www.networkworld.com/cis/ibm_j559/ibm_soastrip.gif" width=165 border=0></DIV>
<H3 style="COLOR: #ab0538">New! Rational SOA Testing Open Beta</H3>
<P>IBM Rational invites you to participate in our open beta program for testing SOA applications. </P>
<P><A href="http://adserver.fattail.com/redir/redirect.asp?CID=202550" target=_blank>Sign up today! </A></P></TD></TR></TBODY></TABLE></DIV></DIV><img src=http://ai.hitbox.com/ai?hb=DM550223OGAN&ai=EMC-CIS_J559_IBM_FEB07 width=1 height=1 border=0></BODY></HTML>


<br clear="all"/>
 
<!-- begin ad tag -->
<SCRIPT LANGUAGE="JavaScript1.1" SRC="http://ad.doubleclick.net/adj/idg.us.nwf.jw_core/;pos=bottom;sz=120x90;tile=6;ord=014834?" ></SCRIPT>
<script>
if ((!document.images && navigator.userAgent.indexOf("Mozilla/2.") >= 0)  || navigator.userAgent.indexOf("WebTV")>= 0) {
document.write('<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=bottom;sz=120x90;tile=6;ord=014834?" TARGET="_blank">');
document.write('<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=bottom;sz=120x90;tile=6;ord=014834?" WIDTH="120" HEIGHT="90" BORDER="0" ALT="Click Here"></A>');
}
</script>
<NOSCRIPT>
<A HREF="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;pos=bottom;sz=120x90;tile=6;ord=014834?" TARGET="_blank">
<IMG SRC="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;pos=bottom;sz=120x90;tile=6;ord=014834?" WIDTH="120" HEIGHT="90" BORDER="0" ALT="alt text">Click Here</A>
</NOSCRIPT>
<!-- end ad tag -->

               <div class="separator">
                  <!-- xxxxxxxxxxxxxx -->
               </div>
               <!--stopindex-->







<div id="imu2">
  
  <NOLAYER>
  <IFRAME id="imu2" src="http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=imu2;sz=336x280;ptile=5;type=news;ord=014834?" width="336" height="280" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no">
  <A href="http://ad.doubleclick.net/jump/idg.us.nwf.jw_core/;abr=!ie;pos=imu2;sz=336x280;ptile=5;type=news;ord=014834?">
  <IMG src="http://ad.doubleclick.net/ad/idg.us.nwf.jw_core/;abr=!ie;pos=imu2;sz=336x280;ptile=5;type=news;ord=014834?" border="0" width="336" height="280"></A>
  </IFRAME>
  </NOLAYER>
  <ILAYER id="imu2" visibility="hidden" width="336" height="280"></ILAYER>
	<script> imusrc = "http://ad.doubleclick.net/adi/idg.us.nwf.jw_core/;pos=imu2;sz=336x280;ptile=3;type=news;ord=";</script>
</div>
               <div id="sponsoredlinks">
	<h5>Sponsored links</h5>
	<DIV id="toplinks">
   <p>
         <a href="http://ad.doubleclick.net/clk;86360745;12174868;t?http://www.ej-technologies.com/products/install4j/landing.html" title="ej-technologies GmbH" onclick="" target="" name="&amp;lid=rid_94549 831311 ej-Technologies Text Link JW">
            <span>Java Installer Builder</span>install4j is easy to use, amazingly powerful and creates beautiful installers for all platforms. Try out the free trial version.</a>
         <strong> - ej-technologies GmbH</strong>
      </p><p class="dotted"><img alt="" height="2" width="400" src="/graphics/templates/spacer.gif"/></p><p>
         <a href="http://ad.doubleclick.net/clk;88837542;12174868;z?http://www.junitfactory.com/?utm_source=javaworld&amp;utm_medium=text_link&amp;utm_content=junit_factory&amp;utm_campaign=march_may" title="www.junitfactory.com" onclick="" target="_blank" name="&amp;lid=rid_95344 831316 Agitar Text Link JWROS">
            <span>JUnit Test Generation</span>Submit Java. Get back FREE JUnit. Try it!</a>
         <strong> - www.junitfactory.com</strong>
      </p>
</DIV>
<DIV id="middlelinks">
   <TABLE cellPadding="0" cellSpacing="0" id="nwtextlinks">
      <TBODY>
         <tr>
            <td>
               <a href="http://ad.doubleclick.net/clk;95675857;12174868;g?http://www.defyallchallenges.com" title="Microsoft Corp" onclick="" target="_blank" name="&amp;lid=rid_97786 872677 Microsoft VS2005 Text Link JWROS">Defy all challenges with Microsoft(r) Visual Studio 2005</a>
               <strong>- Microsoft Corp</strong>
            </td>
            <td>
               <a href="http://ad.doubleclick.net/clk;94414897;12174868;a?http://www.agitar.com/solutions/products/on_site_trial.html?utm_source=javaworld&amp;utm_medium=textlink&amp;utm_content=agitarone-freetrial&amp;utm_campaign=javaworld-agitarone-april" title="Agitar" onclick="" target="_blank" name="&amp;lid=rid_97168 886476 Agitar April Text Link ">Automate JUnit generation for fast, easy Java unit testing. Free trial! </a>
               <strong>- Agitar</strong>
            </td></tr><tr><td>
               <a href="http://ad.doubleclick.net/clk;94925576;12174868;b?http://www.ibm.com/developerworks/websphere/education/enablement/curriculum/#wbi-modeler&amp;S_TACT=105AGY41&amp;S_CMP=JWSOAEDU" title="IBM" onclick="" target="" name="&amp;lid=rid_97435 879693 C589 IBM JAVAWORLD Q1 SOAEDU">IBM WebSphere Business Modeler V6: Learn the basics using a hands-on lab approach.</a>
               <strong>- IBM</strong>
            </td>
            <td>
               <a href="http://ad.doubleclick.net/clk;94926006;12174868;q?http://www.ibm.com/developerworks/websphere/education/enablement/curriculum/#wesb&amp;S_TACT=105AGY41&amp;S_CMP=JWSOAEDU" title="IBM" onclick="" target="" name="&amp;lid=rid_97436 879694 C589 IBM JAVAWORLD Q1 SOAEDU">Learn how to build and deploy mediation integration solutions</a>
               <strong>- IBM</strong>
            </td></tr><tr></tr>
      </TBODY>
   </TABLE>
</DIV>
	<div id="bottomlinks">
		<H4><A href="http://www.industrybrains.com/">Buy a link now.</A></H4>
<p style="width:400px;"><a href="http://links.industrybrains.com/click?sid=620&amp;rqctid=5123&amp;pos=1&amp;lid=431331&amp;cid=103597&amp;pr=2&amp;tstamp=20070417134522&amp;url=http://www.lunarpages.com/id/IB%26campaign%3dJW" target="blank">Reliable and Affordable Web Hosting Services</a><br>Ideal webmaster solutions for small to large sites from Lunarpages. Save $26 with Coupon Code: 26off
</p>
<p style="width:400px;"><a href="http://links.industrybrains.com/click?sid=620&amp;rqctid=5123&amp;pos=2&amp;lid=426845&amp;cid=101068&amp;pr=2&amp;tstamp=20070417134522&amp;url=https://events.webdialogs.com/Portal/WipEvents/register.php%3fid%3d5278e3af29625340fb894dddc02e4adf%26sourceID%3d" target="blank">Cost Effective SOA Management &amp; Runtime Governance</a><br>Webinar April 4th, Using JaxView for SOA Management &amp; Runtime governance.$35 gift card for attending
</p>
<p style="width:400px;"><a href="http://links.industrybrains.com/click?sid=620&amp;rqctid=5123&amp;pos=3&amp;lid=430182&amp;cid=103398&amp;pr=2&amp;tstamp=20070417134522&amp;url=http://ad.doubleclick.net/clk%3b91779202%3b16089618%3bt%3fhttp://dualbrand.seagatestorage.com" target="blank">Maxtor Diamondmax/Mobilemax Drives From Seagate .</a><br>Seagate is now the only partner you need for advanced storage solutions. Learn the benefits here.
</p>
		<!--<H4><A href="http://www.industrybrains.com/">Buy a link now.</A></H4><br clear="all">
		<script type="text/javascript">
		adsonar_pid=462761; // this is the original javaworld pid
		adsonar_ps=1061721;
		adsonar_zw=460;
		adsonar_zh=190;
		adsonar_jv='ads.adsonar.com';
		</script>
		<script language="JavaScript" src="http://js.adsonar.com/js/adsonar.js"></script>	 -->
		<br clear="all">
	</div>
</div>
               <div class="separator">
                  <!-- xxxxxxxxxxxxxx -->
               </div>
               <div id="rcfooter"><strong>RESEARCH CENTERS: </strong>
<a href="http://www.javaworld.com/channel_content/jw-core-index.html"><strong>Java Standard Edition</strong></a> | 
<a href="http://www.javaworld.com/channel_content/jw-enterprise-index.html"><strong>Java Enterprise Edition</strong></a> | 
<a href="http://www.javaworld.com/channel_content/jw-micro-index.html"><strong>Java Micro Edition </strong></a> | 
<a href="http://www.javaworld.com/channel_content/jw-applied-index.html"><strong>Development Tools</strong></a>

<div align="center"><a href="http://www.javaworld.com/info/jw-about-index.html">About Us</a> | <a href="http://www.javaworld.com/info/jw-advertise.html">Advertise</a> | <a href="http://www.javaworld.com/info/jw-masthead.html">Contact Us</a> | <a href="http://www.javaworld.com/info/jw-privacy.html">Terms of Service/Privacy</a> </div>
<div align="center"><a href="http://www.javaworld.com/javaworld/common/jw-copyright.html">Copyright</a>, 2006-2007 Network World, Inc. All rights reserved.</div>
</div>
            </div>
            <div id="footer"><span><a href="http://www.idg.net"><strong>IDG Network:</strong></a> <a href="http://www.cio.com">CIO</a>  <a href="http://www.computerworld.com">Computerworld</a> <a href="http://www.csoonline.com/">CSO</a> <a href="http://demo.com/">Demo</a>  
<a href="http://www.games.net">Games.net</a>
<a href="http://www.idgconnect.com">IDGconnect.com</a>
 <a href="http://www.infoworld.com">Infoworld</a> <a href="http://www.itworldcanada.com">IT World Canada</a> <a href="http://www.linuxworld.com">Linuxworld.com</a> <a href="http://www.macworld.com">Macworld</a>  <a href="http://www.networkworld.com">NetworkWorld.com</a> <a href="http://www.oswmag.com/">Outsourcing World</a> <a href="http://www.pcworld.com">PC World</a> <a href="http://www.playlistmag.com">Playlistmag.com</a></span></div>
<!-- start Vibrant Media IntelliTXT script section -->

<script type="text/javascript" src="http://javaworld.us.intellitxt.com/intellitxt/front.asp?ipid=3407"></script>

<script language="javascript">
	if (typeof menu_lookup == "function") menu_lookup();
</script>
<!-- end Vibrant Media IntelliTXT script section -->
<!--include virtual="/includes/ads-interstitial.html"-->

         </div>
      </div>
   </body>
</html>