您可以这样做,但这只有在大量“开销”的情况下才有可能。假设您想在代理中加载 Java 类,您可以执行以下操作:
- 获取包含您的类的设计说明(例如,具有特殊设计视图或 Java NAPI)
- 使用 DXL 导出笔记
- 提取所有“$ClassData”字段的内容
- Base64 解码内容
- 跳过前 42 个字节,并使用您自己的类加载器加载生成的字节数组(覆盖执行 defineClass 调用的 findClass 方法)
- 现在您可以在代理中实例化该类并通过反射访问它
如您所见,这是可能的,但需要付出比仅仅“加倍” 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);
}
}
}