Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中通过引用获取对象_Java_Reflection_Reference_Rmi_Instrumentation - Fatal编程技术网

在Java中通过引用获取对象

在Java中通过引用获取对象,java,reflection,reference,rmi,instrumentation,Java,Reflection,Reference,Rmi,Instrumentation,我是这个网站的新手,很高兴与大家分享我的第一个问题:) 好的,我将解释一下我目前的设置,以便更好地理解我的问题 我有两个java应用程序: 逻辑应用程序(发生所有重负载时) 插装应用程序(插装到正在运行的游戏中的应用程序) 我使用这两个应用程序所做的是使用插入指令的应用程序从游戏中提取信息,然后将其发送到逻辑应用程序。 信息/数据的提取是通过Java反射API完成的。然后在提取信息之后,通过RMI将其发送到逻辑应用程序(下面将对此进行详细介绍) 我之所以有2个应用程序而不是1个,是因为游戏在Ja

我是这个网站的新手,很高兴与大家分享我的第一个问题:)

好的,我将解释一下我目前的设置,以便更好地理解我的问题

我有两个java应用程序:

  • 逻辑应用程序(发生所有重负载时)
  • 插装应用程序(插装到正在运行的游戏中的应用程序)
  • 我使用这两个应用程序所做的是使用插入指令的应用程序从游戏中提取信息,然后将其发送到逻辑应用程序。 信息/数据的提取是通过Java反射API完成的。然后在提取信息之后,通过RMI将其发送到逻辑应用程序(下面将对此进行详细介绍)

    我之所以有2个应用程序而不是1个,是因为游戏在Java7(旧游戏)上运行,所以插入指令的应用程序在Java7上运行,我可以在我想要的任何Java版本上运行逻辑应用程序

    我在2之间传输数据/信息的方式是通过RMI(远程方法调用)。 说明:逻辑应用程序在插入指令的应用程序中调用getter方法,该方法使用反射API从插入指令的游戏中获取字段值并返回

    现在你们已经了解了我基本上在做什么,现在是我被迷惑了一段时间的挑战

    问题:

    反射返回的大多数字段值都是可序列化的,因此它们通过RMI没有问题。但是,有些是不可序列化的对象,例如“Item”。 “Item”是一个对象,它包含3个值:ID、Name、Quantity。所以我的想法是制作一个包装并发送包装,这样问题就解决了,对吗?但是没有,另一个挑战出现了

    出现的挑战是:如果我需要知道我在另一个时间取出的对象“项目”的数量,该怎么办?如果我的全部内容是一个应用程序,我会使用反射API通过以下方式使用对象获取字段:
    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();
                }
            }
        }