⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reloadclass.htm

📁 这个压缩包里的都是超级经典的java例子
💻 HTM
字号:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Dynamically Reloading a Modified Class (Java Developers Almanac Example)
</TITLE>
<META CONTENT="Patrick Chan" NAME="AUTHOR">
<META CONTENT="Code Examples from The Java Developers Almanac 1.4" NAME="DESCRIPTION">
<META CONTENT="Addison-Wesley/Patrick Chan" NAME="OWNER">
<META CONTENT="3/20/02" NAME="revision">
<META CONTENT="no-cache" HTTP-EQUIV="Pragma">
<LINK href="/almanac.css" media="screen" type="text/css" rel="stylesheet">
</HEAD>
<BODY>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD></TD>
</TR>
</TABLE>
<br>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD></TD>
</TR>
<TR>
<TD rowspan="3"><A HREF="/?l=ex"><IMG BORDER="0" ALIGN="BOTTOM" HSPACE="10" SRC="/egs/almanac14a.jpg"></A></TD><TD VALIGN="top">
<h1>The Java Developers Almanac 1.4</h1>
<br>
        Order this book from <a href="/cgi-bin/scripts/redirect.pl?l=ex&url=http://www.amazon.com/exec/obidos/ASIN/0201752808/xeo">Amazon</a>.
    </TD>
</TR>
<TR>
<TD align="right" valign="bottom">
<FORM method="get" action="/cgi-bin/search/find.pl">
<INPUT size="25" name="words" type="text"><INPUT value="Search" type="submit">
</FORM>
</TD>
</TR>
</TABLE>
<HR color="#6666cc">
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD valign="top"><script type="text/javascript">
<!--
google_ad_client = "pub-6001183370374757";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_channel = "4777242811";
google_ad_type = "text_image";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "6666CC";
google_color_url = "6666CC";
google_color_text = "000000";
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD valign="top">
<DIV ALIGN="LEFT">
<A HREF="/">Home</A>
    &gt;
    <A HREF="../index.html">List of Packages</A>
    &gt;

    
    <A HREF="../java.lang/pkg.html">java.lang</A><font color="#666666" class="xsmall-font">
        &nbsp;[58 examples]
    </font>
        &gt;
        <B><A HREF="../java.lang/pkg.html#Classes">Classes</A></B><font color="#666666" class="xsmall-font">
            &nbsp;[11 examples]
            </font>
</DIV><P>
  <h3>e69. Dynamically Reloading a Modified Class</h3>

This example demonstrates how to reload a modified class without
restarting the application. The technique involves loading the
<font color="#0066ff"><i>reloadable</i></font> class with a separate class loader. Each time the class
needs to be reloaded, it is loaded using a new class loader and the
previous class loader (with the old class) is abandoned.

<P> It is important that the reloadable class not be on the
classpath.  Otherwise, the class will be loaded by some parent of the
new class loader rather than by the new class loader itself. Once this
happens, the class cannot be reloaded.

<P> Since the class cannot be on the classpath, it is not possible
to use the class name directly in the code (otherwise a
<code>ClassNotFoundException</code> would be thrown during start up). To circumvent
this problem, the reloadable class must be made to implement an
interface and the interface name is used in the code.

This example places the reloadable class in a subdirectory
called <code>dir</code>, which is not on the classpath. Here is the reloadable
class:


<pre>    public class MyReloadableClassImpl implements MyReloadableClass {
        public String myMethod() {
            return <font color="#0066ff"><i>"a message"</i></font>;
        }
    }
</pre>
To compile this class, it is necessary to tell the compiler
the location of <code>MyReloadableClass</code>. Since, for this example,
it is located in the parent directory, the following command will compile
this class:

<pre>    &gt; java -classpath .. MyReloadableClass
</pre>
Here's the code that reloads the reloadable class:

<pre>    // Get the directory (URL) of the reloadable class
    URL[] urls = null;
    try {
        // Convert the file object to a URL
        File dir = new File(System.getProperty("user.dir")
            +File.separator+<font color="#0066ff"><i>"dir"</i></font>+File.separator);
        URL url = dir.toURL();        // file:/c:/almanac1.4/examples/
        urls = new URL[]{url};
    } catch (MalformedURLException e) {
    }
    
    try {
        // Create a new class loader with the directory
        ClassLoader cl = new URLClassLoader(urls);
    
        // Load in the class
        Class cls = cl.loadClass("MyReloadableClassImpl");
    
        // Create a new instance of the new class
        myObj = (MyReloadableClass)cls.newInstance();
    } catch (IllegalAccessException e) {
    } catch (InstantiationException e) {
    } catch (ClassNotFoundException e) {
    }
</pre>
Here's some code that tests the reloadable class (a more realistic
routine would periodically check the timestamp on the file).  After the
example is started, change the string returned by <code>myMethod()</code> and
recompile.


<pre>    try {
        while (true) {
            reloadMyReloadedClass();
            System.out.println(myObj.myMethod());
            Thread.sleep(5000);
        }
    } catch (Exception e) {
    }
</pre>
<P><table width="600" CELLSPACING="0" CELLPADDING="2" BORDER="0">
<tr>
<td bgcolor="#6666cc" align="center"><font color="#ffffff">
            &nbsp;<b>Related Examples</b></font></td>
</tr>
</table>


e59. <a class="eglink" href="GetClass.html?l=rel">
    Getting a Class Object
</a>
<br>

e60. <a class="eglink" href="GetClassName.html?l=rel">
    Getting the Name of a Class Object
</a>
<br>

e61. <a class="eglink" href="IsClass.html?l=rel">
    Determining If a Class Object Represents a Class or Interface
</a>
<br>

e62. <a class="eglink" href="SuperClass.html?l=rel">
    Getting the Superclass of an Object
</a>
<br>

e63. <a class="eglink" href="SuperClass2.html?l=rel">
    Getting the Superclass of a Class Object
</a>
<br>

e64. <a class="eglink" href="GetImplements2.html?l=rel">
    Listing the Interfaces That a Class Implements
</a>
<br>

e65. <a class="eglink" href="GetImplements.html?l=rel">
    Listing the Interfaces That an Interface Extends
</a>
<br>

e66. <a class="eglink" href="GetPkg.html?l=rel">
    Getting the Package of a Class
</a>
<br>

e67. <a class="eglink" href="ClassOrigin.html?l=rel">
    Determining from Where a Class Was Loaded
</a>
<br>

e68. <a class="eglink" href="LoadClass.html?l=rel">
    Loading a Class That Is Not on the Classpath
</a>
<br>


<table width="600" CELLSPACING="0" CELLPADDING="2" BORDER="0">
<tr>
<td align="left">
<br>
        See also: 
<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Arrays">
    Arrays
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Assertions">
    Assertions
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Commands">
    Commands
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Numbers">
    Numbers
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Objects">
    Objects
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Strings">
    Strings
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#System%20Properties">
    System Properties
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Threads">
    Threads
</a>&nbsp;&nbsp;

</td>
</tr>
</table>

<br>

<br>
<FONT class="xsmall-font">
&copy; 2002 Addison-Wesley.
</FONT></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD valign="top"><A href="http://compositesw.com/devzone?ref=javaalmanac"><IMG alt="Click Here" height="600" width="120" border="0" src="/csw_oad_120x600_final.gif"></A></TD>
</TR>
</TABLE>
</BODY>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META CONTENT="NO-CACHE" HTTP-EQUIV="PRAGMA">
</HEAD>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -