前言
了解JAVA的類裝載器
Java 編程語言編譯器把源代碼代碼轉換成為一個假定機器(即虛擬機)上的 機器語言
虛擬機代碼保存在一個後綴為
class的類文件中
每個類文件保存這 個類的所有方法的虛擬機代碼
當運行時用一個解釋程序解釋這些類文件
把這些文件內的虛擬機指信信令翻 譯成本地的機器語言
分存內存
確定程序入口點
類裝載器功能類似與C中調入dll文件文法
在C中是調入dll文件分配內存
確定 程序入口點(分配入口指針)
而在java中調入一個class文件
同樣是從本地或網絡 中調入文件
轉換為本地機器代碼
分配內存
確定程序入口點
當我們在使用中有時要使用一個新類
知道它的文件路徑和它的文件名字
我們 要把它調入系統並使用它或者說一個類文件已經被加密處理
類文件裡面的內容 是我們加密後的密文
不能直接使用
只能是對文件內容解密後才能使用
就可 以用類庫加載器ClassLoader
把類文件當做數據流讀入到一個byte[]中
對 這個 byte[]進行解密處理後(沒加密當然就不用做這步了)
再通過 byte[] 生成一個類
並加載到系統中
對於使用中有以下兩種方法
方法
使用接口類
新調用的class是對它的具體實現
) 寫一個接口類 newface
class
public interface newface {
public void out(String xx);
public int outsize(String x
String x
);
}
) 寫接口文件實現 testfacea
class 並更名為 testfacea
file 或其它文件名全可以
/*
newface的實現
*/
public class testfacea implements newface{
public void out(String xx) {
System
out
println(xx+
for testfacea
);
}
public int outsize(String x
String x
) {
return x
length()+x
length();;
}
}
執行的的命令
javac testfacea
java
ren testfacea
class testfacea
file
) 在主程序中調入文件到byte[]中
可以在文件可以在本地
也可用網絡無論如何只要能將編譯後的文件內容的類代碼放到 byte[]當中就可以
java
io
FileInputStream in=new java
io
FileInputStream(namefile);
byte[] classbyte=new byte[maxsize];
) 轉換成一個Class並初始化
return defineClass(classname
classbyte
readsize);
) 實現接口
實際上就是對一個接口類用調入的文件實現
當然可以用不同的文件進行不同的實現也可以對一個文件進行加解密操作
//方法
的例子代碼
newface是本地接口類
newface
class本地已經存在 開始
testc=cl
load(
testfacea
file
testfacea
);
testo=testc
newInstance();
((newface)testo)
out(
方法
第(
)種使用方法
);
System
out
println(
outsize=
+((newface)testo)
outsize(
aaaa
));
或
testc=cl
load(
testfacea
fisle
testfacea
);
testo=testc
newInstance();
newface newface
=(newface)testo;
newface
out(
方法
第(
)種使用方法
);
System
out
println(
outsize=
+newface
outsize(
bbbbb
));
要注意的是對一個要調入的文件
一定要是一個已經存在的接口類的實現這個有點EJB中的調用的中遠程接口要在本地
而調入的文件就是EJBobject了這種方法的的好處是要調入的class中的方法是可以說是已知的
相對來講這種方法簡明易用以下是主程序的完整代碼
//使用的主程序
public class testnewface {
public static void main(String[] args) throws java
lang
Exception
{
// 共用初使化參數
開始
Class testc;
Object testo;
cloader cl=new cloader();
// 共用初使化參數
結束
//方法
的例子代碼
newface是本地接口類
newface
class本地已經存在 開始
testc=cl
load(
testfacea
file
testfacea
);
testo=testc
newInstance();
((newface)testo)
out(
方法
第(
)種使用方法
);
System
out
println(
outsize=
+((newface)testo)
outsize(
aaaa
));
testc=cl
load(
testfacea
fisle
testfacea
);
testo=testc
newInstance();
newface newface
=(newface)testo;
newface
out(
方法
第(
)種使用方法
);
System
out
println(
outsize=
+newface
outsize(
bbbbb
));
//方法
的例子代碼
結束
}
}
/*
要想自己完成從一個 byte[] 轉換到一個Class 必須要 extends ClassLoader
因為ClassLoader中的方法defineClass是 protected 要使用只有 extends ClassLoader
*/
class cloader extends ClassLoader {
static int maxsize=
;
public Class load(String namefile
String classname) throws java
lang
Exception
{
try {
//進行判斷這個class是否已經調入
已經有就直接返回
不然就調入
Class ctmp=this
findLoadedClass(classname);
System
out
println(ctmp
getName()+
is load
);
return ctmp;
}
catch (Exception e) {
//System
out
println(e);
}
java
io
FileInputStream in=new java
io
FileInputStream(namefile);
byte[] classbyte=new byte[maxsize];
//實際應用時完全可以對一個文件進行加解密處理
只要保證使用defineClass時classbyte中
//已經解密後的內容就可以
int readsize;
readsize=in
read(classbyte);
// System
out
println(
讀文件長:
+readsize);
in
close();
return defineClass(classname
classbyte
readsize);
}
}
方法
不使用本地接口類的方法
這種方法class從文件定義成一個class和方法
是相同的
但要使用這個class就不同了
這種方法不需要接口類
) 寫一個類 testfacea
class (本例中為了方便還是使用了testfacea
實際上已經可以不用 implements newface
即可以完全不用接口類)
public class testfacea {
public void out(String xx) {
System
out
println(xx+
for testfacea
);
}
public int outsize(String x
String x
) {
return x
length()+x
length();;
}
}
為明析起見還有一個測試用類型
一個列系統信息表的類
public class listinfo {
public static void main(String[] args) {
//列系統信息表 begin
String skey
sinfo;
Object so;
java
util
Enumeration hlistkey=System
getProperties()
propertyNames();
while (hlistkey
hasMoreElements())
{
skey=(String)hlistkey
nextElement();
so=System
getProperty(skey);
System
out
println(
key=
+skey+
info=
+so);
}
//列系統信息表 end
}
}
) 生成 testfacea
class 更名為 testfacea
file 或其它文件名也可以
生成 listinfo
class 更名為 listinfo
file 或其它文件名也可以
執行的的命令
javac testfacea
java
ren testfacea
class testfacea
file
javac listinfo
java
ren listinfo
class listinfo
file
) 主程序中調入文件到byte[]中
可以在本地文件調用
也可用網絡無論如何只要能將
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19297.html