a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 94|回复: 0

[其他] JAVA技巧:Java类别载入器分析(1)

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
1 Java的动态特性
0 {1 D+ N) y2 F    Java的动态特性有两种,一是隐式的;另一种是显示的。隐式的(implicit)方法就是当程式设计师用到new 这个Java 关键字时,会让类别载入器依需求载入您所需要的类别,这种方式使用了隐式的(implicit)方法。显式的方法,又分成两种方式,一种是藉由java.lang.Class 里的forName()方法,另一种则1 M6 |/ j( i* x- J- f8 `. H* A6 y
    是藉由java.lang.ClassLoader 里的loadClass()方法。您可以任意选用其中一种方法。) P! J' X/ c* c  J2 S* Y* F& [
    2 隐式的动态特性
4 Y. l7 C1 w0 b- _! B    在执行java文件时,只有单独的变量声明是不会载入相应的类的,只有在用new生成实例时才载入
4 Y9 O. `2 ^' y* {5 s* ^2 t9 H, k    如示例所示:
. {. o! u) f5 V& p4 E) o  V    public class Main* l( v! U2 |% E
    public static void main(String args[])' w/ Y7 q) q3 y
    {
8 }+ m6 R9 t- d    A a1 = new A() ;
" u5 [7 z% k4 G* P    B b1 ;
8 I! z) ~' g5 D    }
6 j, h4 J# P8 f! u    类A和B相同,如下:8 H8 S+ b3 d2 c) d! A7 X* a. ]1 D
    public class A
) w2 r5 n% A3 N% ?0 K! ?    {
0 ~: g2 l- Y6 A: R    public void print(“using A”);
( G  H6 b. V6 x% j    }
2 [- F3 C; D( C8 c- x5 Q    编译后,可用java –verbose:class Main运行,察看输出结果。可以看到JVM只载入了A,而没有载入B.
* s: t! p, b* V) D+ o7 R    另外,类的载入只在执行到new一个类时,才载入,如果没有执行到new语句,则不载入。- f# y8 U( u6 ?
    如://类Office6 X( i7 v8 }$ U& g- b' P
    public class Office
& ^0 f9 `  T4 R6 ~  [5 p    {
5 b6 \7 F! Z. U( K: D$ o, j    public static void main(String[] args)2 Q! E( v8 P4 ~# U0 c* I: W
    {
& G+ Q/ o. F( I8 p1 j( d+ i# I( v    Word myword=null;7 n1 F6 }( n, t4 p: V1 V
    Excel myexcel=null;
3 L6 e' `# X- t1 I# C, h    if (args[0].equals("Word"))- z9 G; m% Q6 X0 P$ U2 G& M
    {( I5 b0 f" j- P- u
    myword = new Word();4 I9 C) E# |) n" {6 A
    myword.start();( m7 ~# ~4 G6 t4 a8 F* c- r
    }. G+ D2 U  Q" G) T
    if (args[0].equals("Excel"))
- r0 ?1 a8 h8 S& F# e    {
. K2 H7 O5 K' v6 b4 [' s& b& j    myexcel = new Excel();
. ~4 @. F6 z: t$ B    myexcel.start();
/ ^# C/ ^" E" H- |* c. r    }0 S+ s6 P0 {% H. ]7 l; C
    }
* Q3 U  |& ?: n    }
8 K  Q, e% |; N$ J    //类Word和Excel基本相同,如下. _/ k1 T, u: T
    public class Word( |1 ?0 E! z0 w% X+ {6 R3 ]7 }- R
    {( \% B4 ~2 F6 N: C+ O* i# h8 X
    public void start()
2 \5 _5 R" p; ^+ e- {9 i0 ^    {
; l6 @/ ^. B. B5 s  s    System.out.println("using word");
' D2 f7 W" O! H# b: l" Z$ p    }5 h0 A5 k: D  @/ y6 q/ |
    }
3 |" K9 s) d2 |% s    在dos命令提示符下,输入java –verbose Office Excel可以看到JVM只载入Excel类,而不载入Word类。
3 T' Z% k3 @- z4 r) I9 L    3 显示的动态特性3 V$ A0 x. Z5 v, q/ s. G
    3.1 java.lang.Class里的forName()方法
$ P* t. |: o+ Y" U' n+ \& W    在上一个Office示例中,进行如下修改:2 o: w6 l$ p$ t2 N0 u
    一 加入Assembly类& J: w0 ^- j- H3 P& O. B$ l
    public interface Assembly
$ R& C4 l. B, J* V9 p    {
: Y2 z) O  r. c+ i# _1 c/ v' O, ?    public void start();
7 y% c& ?6 X1 [" l& S: u    }$ m" K% ~5 t3 d4 R
    二 让Word和Excel类实现该接口
( `$ \/ |/ O3 ^/ J7 u' K/ G    public class Word implements Assembly
2 R. m' C  C0 X; d% d$ }3 t    {
. g+ K1 }5 C% |/ f: b  Y6 R: A, z    public void start()
8 c+ d  K3 L( a1 C: A    {; g7 D4 x. v7 D& l5 D
    System.out.println("using word");
$ _- s8 W* x5 B: A. O+ q    }* x6 F5 e' x7 w5 Q1 \( j( Q
    }
7 q0 q/ U$ C; {) `/ z+ F9 d8 m    三 Office 类如下所示
. ^3 p* R2 k2 k% @8 h" G6 [! I    public class Office7 D7 C/ H7 x* P3 m: |( c
    {
! Z# a3 C8 X0 q5 o8 @9 z    public static void main(String[] args) throws Exception5 n; n0 S( @+ G+ Z5 l
    {
. O  s. s9 ]4 `( q5 N! B    java.lang.Class c = java.lang.Class.forName(args[0]);
: k  m8 r. w  U# L* j- {% q1 P( k    Object o = c.newInstance();
" C! ^' F5 j) Q' J: `3 ~/ r    Assembly a = (Assembly)o;2 m! B: ?- T" b8 H/ e4 ?
    a.start();
( ]7 V* M$ N5 h$ O    }' q& _2 h* ]" d/ D6 P' q6 k
    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 03:04 , Processed in 0.275367 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表