你可以做到這一點,但是這是唯一可能與大量的「開銷」的。假設你想在一個代理加載Java類,你可以做到以下幾點:
- 獲取包含類(FE經特殊設計視圖或Java NAPI)
- 導出注意到DXL的設計注意事項
- 提取內容的所有「$ ClassData」字段
- Base64編碼解碼內容
- 跳過第一42個字節,並用自己的類加載器加載得到的字節陣列(覆蓋的findClass方法,該方法做了的defineClass調用)
- 現在,你可以通過反射
在您的代理和訪問它實例化類正如你看到的,這是可能的,但不是僅僅「翻一番」,在庫中較高的努力DDE。
編輯:
下面是一個例子類加載器的試劑。 Base64編碼的DXL已經添加。 代理實例化類ch.hasselba.demo.LoadedClass並調用方法printTime():
package ch.hasselba.demo;
public class LoadedClass {
public void printTime(){
System.out.println("Time: " + System.currentTimeMillis());
}
}
代理的代碼(使用lwpd.commons.jar)
import lotus.domino.AgentBase;
import com.ibm.commons.util.io.base64.Base64;
import java.lang.reflect.Method;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
// trucated DXL string
String dataDXL = "YQAYAAAAAACqAgAAAQAAAAAAAAAAAAAAYAC8AgAAqgKqAgAAAAAAAAAAyv66vgAAADEALwcAAgEAFWNoL2hhc3NlbGJhL3hwYWdlcy9aWgcA";
// base64 decode the string
String b64 = Base64.decode(dataDXL);
byte[] b64Bytes = b64.getBytes();
byte[] classBytes = new byte[b64Bytes.length - 42];
// skip the first 42 bytes
System.arraycopy(b64Bytes, 42, classBytes, 0, b64Bytes.length - 42);
try {
// load the class
ByteClassLoader obj = new ByteClassLoader();
Class theClass = obj.findClass("ch.hasselba.demo.LoadedClass", classBytes);
// instantiate it
Object theInstance = theClass.newInstance();
// get the method printTime via Reflection & call it
Method theMethod = theInstance.getClass().getMethod("printTime", null);
theMethod.invoke(theInstance, null);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// the class loader
public static class ByteClassLoader extends ClassLoader {
public Class findClass(String name, byte[] data) {
return defineClass(name, data, 0, data.length);
}
}
}
類似的問題:http://www-10.lotus.com/ldd/xpagesforum.nsf/xpTopicThread.xsp?action=openDocument&documentId=E89573775690EC9C85257840001DC328 – Naveen