a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 95|回复: 0

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

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
1 Java的动态特性! }& {1 Q' d* p* z
    Java的动态特性有两种,一是隐式的;另一种是显示的。隐式的(implicit)方法就是当程式设计师用到new 这个Java 关键字时,会让类别载入器依需求载入您所需要的类别,这种方式使用了隐式的(implicit)方法。显式的方法,又分成两种方式,一种是藉由java.lang.Class 里的forName()方法,另一种则: G* r: W0 M; ]: r! p- b2 ]
    是藉由java.lang.ClassLoader 里的loadClass()方法。您可以任意选用其中一种方法。6 Y; _5 u$ E6 T4 ?4 d9 L+ W1 ]
    2 隐式的动态特性
( ~7 u$ k* G1 V6 w3 K9 m    在执行java文件时,只有单独的变量声明是不会载入相应的类的,只有在用new生成实例时才载入  y4 |, X$ c9 E- U2 P
    如示例所示:: ]# J. v" ~9 W6 p: @
    public class Main% E4 g! @) N8 ]( g# S( |
    public static void main(String args[])
8 I, C6 ~2 {# e% @) m    {4 }! C% f5 D" |7 f* j
    A a1 = new A() ;
" d6 [, `# k6 m& @) H    B b1 ;4 ?/ Z! k" A# N  t0 _: G5 N
    }
) N1 l0 u" a1 ?9 Y, l4 k    类A和B相同,如下:4 o5 X6 h/ w, T6 a! M1 @3 {9 \$ q
    public class A
) v5 a, G( M9 K/ s    {) P1 @1 j* x+ J1 d# c9 s1 N9 p
    public void print(“using A”);1 k8 q/ P( X, |9 _! ]
    }4 f5 o/ y9 b+ o3 l( a
    编译后,可用java –verbose:class Main运行,察看输出结果。可以看到JVM只载入了A,而没有载入B.
% V5 V: V. |3 a" h; x    另外,类的载入只在执行到new一个类时,才载入,如果没有执行到new语句,则不载入。
) U) L: w1 u$ P* F5 }% ?    如://类Office
+ v1 {6 W* O1 ?# I9 `) t- S    public class Office! W2 f- b5 z8 q  S6 j; S
    {3 i& {% q+ o0 t: b& P
    public static void main(String[] args)& b  n: h. p, w, R  c8 ?
    {
4 }/ i  M) f9 J* b1 ?' h' w    Word myword=null;3 m$ ]2 C: V# e1 B- C% a
    Excel myexcel=null;/ J* b7 E4 V3 Y/ F' t
    if (args[0].equals("Word"))
* a: c: U4 }& _- ?7 I% ]& K    {
9 W$ A3 T- a. ]    myword = new Word();) x/ z) x" {: U3 F) V
    myword.start();
# Y5 p# r6 ], b7 r    }; u" G% l7 i1 o  E! K9 M* z. ~
    if (args[0].equals("Excel"))
) W. K. h4 `: v7 D" N# Y  }    {
. X" s- R& B7 F/ ?    myexcel = new Excel();/ `* O9 Z" n( @8 ]6 Z5 s( ^+ E
    myexcel.start();
' w, o3 o0 s" K7 P+ k8 L5 z    }
) g/ _8 `. d, X! }) Y1 p    }; W9 W  y: z8 ?1 w, q7 ?* c- q8 N. p
    }
7 f. j5 \  k: \$ O    //类Word和Excel基本相同,如下7 s" p0 S+ w9 q+ X0 |# U* u8 B
    public class Word( b4 @! f+ C! k9 ^, k
    {% X: S: U* B, ~. k
    public void start()
! R! e4 _9 h- O0 d8 o    {% r# q$ v. E- @) v$ _! \1 Y6 h) D
    System.out.println("using word");" y& U# F: ^  s" O; y! W6 O. l9 h- Z
    }
. K) P* \9 i, |) w8 M# ?    }/ l  t8 k* J7 ~3 T
    在dos命令提示符下,输入java –verbose Office Excel可以看到JVM只载入Excel类,而不载入Word类。$ |* i, B9 v# }$ e% E: e
    3 显示的动态特性4 `  i- R. |6 t1 N3 N8 W* U
    3.1 java.lang.Class里的forName()方法+ D# G4 y3 M. d' g! K
    在上一个Office示例中,进行如下修改:. o8 d- l' s2 l( F8 G; q" \6 [
    一 加入Assembly类
1 D; Y& D/ d0 q$ s" p* ~    public interface Assembly
( e0 m$ H$ W* u3 n/ `* ?    {8 s8 z9 w6 s; R6 f' s
    public void start();' d# r# V. F" E7 O/ {7 B
    }
, s5 A1 @3 ^7 W" b0 v    二 让Word和Excel类实现该接口
: g- `! j# u" l9 ?    public class Word implements Assembly
0 {+ n- ~0 y2 Y7 c- g) f- H4 p    {& `( s) `! {, [* }9 n6 {$ x$ h
    public void start()  r5 G  k# s3 i. a. @
    {
% ?* z4 I; q/ M2 D. j2 {$ |& Z    System.out.println("using word");
/ k0 R- ?% H( {/ T9 U  n    }8 \5 d: g( U5 P
    }
# r( W5 l' A( b    三 Office 类如下所示1 h! I  ~. m( b, c7 S) Q9 k
    public class Office0 n4 N9 E5 u) @( {2 v" A6 e% @
    {4 X  W) s! G, @: ?+ v3 P1 y
    public static void main(String[] args) throws Exception) P: [- T3 T( I; S% h
    {5 _, Z2 H1 ?. F% i
    java.lang.Class c = java.lang.Class.forName(args[0]);
: [: ^; S; f: O3 @    Object o = c.newInstance();
( `; h) }, S2 W& `    Assembly a = (Assembly)o;0 w2 z6 m$ v4 u: v& l/ g9 l
    a.start();
+ X  i  r: `* C: g- B' F    }
- N* a/ D3 y+ y( B' w0 ]    }
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 04:20 , Processed in 0.256894 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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