在Java中通过引用获取对象
我是这个网站的新手,很高兴与大家分享我的第一个问题:) 好的,我将解释一下我目前的设置,以便更好地理解我的问题 我有两个java应用程序:在Java中通过引用获取对象,java,reflection,reference,rmi,instrumentation,Java,Reflection,Reference,Rmi,Instrumentation,我是这个网站的新手,很高兴与大家分享我的第一个问题:) 好的,我将解释一下我目前的设置,以便更好地理解我的问题 我有两个java应用程序: 逻辑应用程序(发生所有重负载时) 插装应用程序(插装到正在运行的游戏中的应用程序) 我使用这两个应用程序所做的是使用插入指令的应用程序从游戏中提取信息,然后将其发送到逻辑应用程序。 信息/数据的提取是通过Java反射API完成的。然后在提取信息之后,通过RMI将其发送到逻辑应用程序(下面将对此进行详细介绍) 我之所以有2个应用程序而不是1个,是因为游戏在Ja
getClassLoader().loadClass(“ItemClass”).getDeclaredField(“Item”).get(我先前获取的对象)代码>
但是,由于我必须将对象转移到逻辑应用程序,我无法转移对象本身“项”,因此我无法返回到该对象并获取更新的信息,除非我再次查找该对象,这是一种资源浪费,使我的整个过程变慢
应用程序的工作原理如下:
插入指令的应用程序->反射->游戏->字段值(称为项目的对象)->包装器->RMI->逻辑应用程序(对象信息已发送,但对象本身无法发送,因为它不可序列化)
问题摘要(使用上面的指针):如何获取对象(项),以便使用反射获取有关它的更新信息
这是我用来获取字段值(对象)的方法:
我希望一切都是可以理解的,我不是英国人,所以如果出现问题,我道歉
谢谢大家! 这个问题没有“正确”的答案
我制作了一张存储对象的地图,并为每个对象指定了一个唯一的键。然后我通过RMI发送了对象的唯一密钥,现在我可以使用唯一密钥获取对象,并随时发送对象的内部信息。如果对象没有循环引用,请尝试JSON。建议使用GSON
另一种方法是使用UnSafe将它们注册到内存中,然后使用地址抓取对象。尽管您必须稍后释放它,否则它将成为一片焦土。您的插入指令的应用程序能否维护一个包含项目的数据结构,并通过某个键进行索引。可以将该键添加到返回到逻辑应用程序的项数据中,以便它可以向插入指令的应用程序请求有关与该键关联的项的更新信息。@tgdavies我想到了这一点,创建HashMap并添加具有唯一ID的对象,然后使用包装器将唯一ID发送到逻辑应用程序。但问题是。。如果对象是一组不可序列化的对象,该怎么办。。然后我必须将所有元素添加到哈希映射中。。再过一段时间,散列映射也会出现问题。我想,如果只有一个应用程序,您也会遇到同样的问题:您需要能够查找以前检索到的对象。@tgdavies不,我不会,因为我可以使用反射并使用它获取对象信息。假设我通过一个数组找到了我想要的对象,比如说。。。名称为“火箭”且数量为“10”的物品。然后,我可以将其包装在包装器中,并在以后使用相同的对象,通过执行getClassLoader().loadClass(“ItemClass”).getDeclaredField(“Item”).get(之前检索到的对象);但是你以后怎么才能找到这个物体呢?您需要在某些数据结构中引用它。
/**
*
* @param params owner;fieldName;multiplier
* @param object null if static
* @return returns the value of the object provided.
*/
public Object getFieldValue(String params, Object object) {
String[] paramsSplit = params.split(";");
try {
Class<?> clazz = classLoader.loadClass(paramsSplit[0]);
Field field = clazz.getDeclaredField(paramsSplit[1]);
field.setAccessible(true);
Object o = field.get(object);
if(!paramsSplit[2].equals("0")) return getMultipliedValue((Number) o,paramsSplit[2]);
else return o;
} catch (IllegalAccessException | NoSuchFieldError | ClassNotFoundException | NoSuchFieldException e) {
e.printStackTrace();
}
return null;
}
public void inject() {
VirtualMachine vm = null;
try {
vm = VirtualMachine.attach(String.valueOf(pid));
vm.loadAgent(Info.baseLocation());
} catch (AttachNotSupportedException | IOException |
AgentLoadException | AgentInitializationException e) {
e.printStackTrace();
} finally {
try {
if(vm != null) vm.detach();
} catch (IOException e) {
e.printStackTrace();
}
}
}