`

关于Java私有对象的读取

 
阅读更多

有些系统通信涉及到跨平台,其中hessian是可以做.net和java平台之间报文,hessian里面有一个最重要的东西就是序列化,但是用过java的人都知道序列化的时候如果是私有对象的,是不可能被外部对象读取,存在get/set方法也不是必须的,因为做为通信的对象完全可能不存在该方法,如果一个对象可以被序列化及反序列化那么就一定存在一种方式去跨过java的语言限制,这是hessian里面的一段源码

     try {
      Class<?> unsafe = Class.forName("sun.misc.Unsafe");
      Field theUnsafe = null;
      for (Field field : unsafe.getDeclaredFields()) {
        if (field.getName().equals("theUnsafe"))
          theUnsafe = field;
      }

      if (theUnsafe != null) {
        theUnsafe.setAccessible(true);
        _unsafe = (Unsafe) theUnsafe.get(null);
      }

      isEnabled = _unsafe != null;

      String unsafeProp = System.getProperty("com.caucho.hessian.unsafe");

      if ("false".equals(unsafeProp))
        isEnabled = false;
    } catch (Throwable e) {
      log.log(Level.FINER, e.toString(), e);
    }

这个是一段取一个类的私有对象的方法,通过Field类反射就可以得到私有对象,下面是一段赋值的代码

    @SuppressWarnings("restriction")
    StringFieldDeserializer(Field field)
    {
      _field = field;
      _offset = _unsafe.objectFieldOffset(_field);
    }

    @SuppressWarnings("restriction")
    void deserialize(AbstractHessianInput in, Object obj)
      throws IOException
    {
      String value = null;
     
      try {
        value = in.readString();

        _unsafe.putObject(obj, _offset, value);
      } catch (Exception e) {
        logDeserializeError(_field, obj, value, e);
      }
    }

这个是字符串属性的反序列化的代码,通过unsafe类可以得到该field的一个偏移量数据,然后通过偏移量给该field指向的对象赋值,这样就解释为什么没有set方法他也能给对象赋值,这种方式有点类是C语言里面的memset方法,知道一个地址或者指针以后,就可以对该地址存放一定类型的数据

分享到:
评论

相关推荐

    Java面向对象编程练习题.pdf

    在 main 方法中,使用 Scanner 对象读取用户输入的数字,并比较与成员变量 v 的值,输出对应的结果。这展示了 Java 中类的成员变量的使用和访问。 知识点: * 类的成员变量 * 构造方法 * Scanner 对象的使用 * ...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...

    Java面向对象程序设计课后答案全解

    Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)原则,为开发者提供了构建复杂软件系统的方法。本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象...

    东北大学JAVA 面向对象实验全部实验代码1到6

    【Java面向对象编程基础】 Java是一种广泛使用的面向对象编程(OOP)语言,以其平台无关性、安全性以及高效性著称。在东北大学的JAVA面向对象实验中,学生会深入学习这一核心概念。 1. 类与对象:在Java中,一切皆...

    Java面向对象程序设计模拟试题

    根据给定的文件信息,我们可以总结出以下关于Java面向对象程序设计的重要知识点: ### Java面向对象基础 #### 1. 对象的创建与释放 - **创建对象**: 在Java中,使用`new`关键字来创建一个新的对象实例。例如,创建...

    Java私有构造器使用方法示例

    "Java私有构造器使用方法示例" Java 私有构造器是 Java 编程语言中的一种特殊的构造器,它使用 private 关键字声明,以控制访问权限。私有构造器的主要作用是阻止对象的生成,防止类被实例化和子类化。通过私有构造...

    java 反射取得类的私有属性,通过私有属性取得属性值

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和方法,即使这些属性或方法是私有的。这篇博客文章可能讨论了如何利用反射机制来获取类的私有属性并读取其对应...

    java之面向对象 附源代码

    此外,Java还支持getter和setter方法来安全地读取和修改对象的状态,进一步实现了数据的封装。 2. 继承: 继承允许一个类(子类)从另一个类(父类)中获取属性和行为,减少了代码的重复,提高了代码的复用性。在...

    《Java面向对象程序设计》习题

    Java面向对象程序设计是计算机科学领域中一门重要的课程,它主要涵盖了如何使用Java语言来实现面向对象编程的概念。本资源包含的是《Java面向对象程序设计》课本课后的所有习题,旨在帮助学习者深入理解和应用Java中...

    java面向对象面试题

    实现序列化通常需要让类实现`Serializable`接口,然后使用`ObjectOutputStream`和`ObjectInputStream`类来写入和读取对象。 #### 7. ".java"源文件中多个类的限制 在一个`.java`文件中可以包含多个类,但是每个...

    Java面向对象编程练习题答案0.pdf

    根据提供的文件内容,我们可以提炼出几个Java面向对象编程相关的知识点。以下是对文件内容的分析和相关知识点的讲解: 1. 类的基本定义与构造函数 - 从第一部分代码中,我们可以看到一个名为A的类定义。在这个类中...

    Java读取Excel解析为JavaBean

    在Java开发中,有时我们需要处理来自Excel文件的数据,例如导入用户信息、商品列表等。...通过这种方式,我们可以高效地将Excel数据转换为Java程序可以方便操作的对象,从而实现数据的导入、分析或其他业务逻辑。

    孙卫琴《Java面向对象编程》ppt 和源代码

    《Java面向对象编程》是Java学习的经典教材,由知名讲师孙卫琴编著。这份资料包含PPT演示文稿和配套的源代码,旨在帮助学习者深入理解和掌握Java的面向对象编程思想。以下是对其中主要知识点的详细阐述: 1. **面向...

    java面向对象编程

    ### Java面向对象编程详解 #### 引言:一切皆对象 在Java中,面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将程序设计围绕对象进行,对象是数据和操作这些数据的函数的封装体。正如标题所...

    S2实现java面向对象编程1—16PPT

    例如,你可以将学生的成绩设为私有,通过公有的get和set方法来读取和修改。 3. **继承**:继承允许子类从父类继承属性和方法,实现代码重用。Java中的关键字`extends`用于实现继承,子类可以扩展父类的功能,或者...

    JAVA基础-面向对象课程笔记

    2. 提供公共的getter和setter方法来读取和修改私有属性。 **This关键字**用于在方法中指代当前对象。当方法中的局部变量与类的属性名称相同时,可以使用`this`关键字来区分。 ### 总结 面向对象编程通过将问题...

    吃货联盟订餐系统(Java+对象+数组)

    6. **封装**:面向对象编程的一个重要原则,将数据和操作数据的方法绑定在一起,形成私有化(private)的属性和公共接口(public),这样可以保护数据不被外部随意修改,提高代码的安全性和维护性。 7. **继承和...

    java反射机制,调用私有方法

    这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中,反射主要用于以下几个方面: 1. **动态类型**:反射机制允许我们在运行时判断一个对象的真实类型,这在...

Global site tag (gtag.js) - Google Analytics