`
lobin
  • 浏览: 116403 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
>tree . /F Folder PATH listing for volume D Volume serial number is F075-351A └───com     └───jx             com_jx_Object.cpp             com_jx_Object.hpp             com_jx_Object.obj             libobj.dll             libobj.exp             libobj.lib             Object.class             Object.java             ObjectTest.java   package com.jx; public class Object { private int index; public Object(int index) { this.index = index; } public int index() { return index; } public native int addr(); static { System.loadLibrary("libobj"); } } >javac com\jx\Object.java   >javah -jni -d com\jx com.jx.Object  com_jx_Object.hpp: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jx_Object */ #ifndef _Included_com_jx_Object #define _Included_com_jx_Object #ifdef __cplusplus extern "C" { #endif /* * Class: com_jx_Object * Method: addr * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_jx_Object_addr (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif com_jx_Object.cpp: #include <stdio.h> #include "com_jx_Object.hpp" JNIEXPORT jint JNICALL Java_com_jx_Object_addr (JNIEnv *env, jobject jobj) { jlong addr = reinterpret_cast<jlong>(jobj); printf("Java_com_jx_Object_addr.\n"); printf("obj addr: %ld\n", jobj); printf("obj addr: %ld\n", &jobj); printf("obj addr: %ld\n", addr); return 0; }   >cl /GR /GX /W3 /ID:\usr\bin\jdk1.8.0_101\include /ID:\usr\bin\jdk1.8.0_101\include\win32 /c /Fo.\ *.cpp   >link /DLL /OUT:.\libobj.dll .\*.obj 也可以使用以下命令一次就生成库文件 # 也可以使用以下命令一次就生成库文件: >cl /ID:\usr\bin\jdk1.8.0_101\include /ID:\usr\bin\jdk1.8.0_101\include\win32 /LD com_jx_Object.c 将生成的库文件libobj.dll放在path目录下   package com.jx; import java.lang.reflect.Field; import sun.misc.Unsafe; public class ObjectTest { public static void main(String[] args) throws Throwable { String libPath = System.getProperty("java.library.path"); System.out.println(libPath); Unsafe unsafe = getUnsafe(); Object obj = new Object(12345); Field field = Object.class.getDeclaredField("index"); long addr = location(obj); System.out.println("obj addr: " + obj.hashCode()); System.out.println("obj addr: " + addr); System.out.println("obj addr: " + unsafe.getAddress(addr)); long valueOffset = unsafe.objectFieldOffset(field); System.out.println("index offset: " + valueOffset); int value2 = unsafe.getInt(obj, valueOffset); System.out.println("index: " + value2); value2 = unsafe.getInt(addr + valueOffset); System.out.println("index: " + value2); obj.addr(); } public static long location(Object object) throws Throwable { Unsafe unsafe = getUnsafe(); Object[] array = new Object[] {object}; long baseOffset = unsafe.arrayBaseOffset(Object[].class); int addressSize = unsafe.addressSize(); long location; switch (addressSize) { case 4: location = unsafe.getInt(array, baseOffset); break; case 8: location = unsafe.getLong(array, baseOffset); break; default: throw new Error("unsupported address size: " + addressSize); } return (location); } private static Unsafe getUnsafe() throws Throwable { Class unsafeClass = Unsafe.class; for (Field f : unsafeClass.getDeclaredFields()) { if ("theUnsafe".equals(f.getName())) { f.setAccessible(true); return (Unsafe) f.get(null); } } throw new IllegalAccessException("no declared field: theUnsafe"); } } 运行结果 obj addr: 5433634 obj addr: 46840104 obj addr: 695505153 index offset: 8 index: 12345 index: 12345 Java_com_jx_Object_addr. obj addr: 10157232 obj addr: 10157172 obj addr: 10157232          
0
0
分享到:
评论
相关资源推荐
  • Java语言中没有引用传递,只有值传递。到底对不对? 在传递引用的时候其实是复制了一份引用传进去的. A a=new A(); test(a) 相当于 (A b=a; test(b) ) 如果传的是基本数据类型,修改这个值并不会影响作为参数传进来的那个变量,因为你修改的是方法的局部变量,是一个副本。  如果传的是一个对象的引用,也是一样的,也是一个副本,但是这个副本和作为参数传进来的那个引用指向的是内存中的同一个对象,所以你通
  • 面向对象编程语言中的类和对象 面向对象程序设计的重点是“类”的设计,而不是对象的设计。在面向对象程序设计中,类是一个独立的单位,它有一个类名,其内部包括成员变量,用于描述对象的属性;还包括类的成员方法,用于描述对象的行为。一个对象由一组属性和一组对属性进行操作的方法构成。面向对象程序设计是将人们认识世界过程中普遍采用的“分类”思维方法应用到程序设计中,“类”提供了为应用程序操纵的实体进行建模的便利机制——将具有相同属性及相同行为的一组对象封装为类,也就是将方法和数据合并到自己的功能数据结构中。
  • java -面向对象编程-类与对象 上一章讲了面向对象编程的理念以及为什么要学习面向对象编程。但是我们也说了。面向对象编程是一个理念,要掌握它不是一日之功,而是要不断地学习,实践再学习。而今天说讲的内容,就是你学习面向对象编程的第一步:类与对象。这是面向对象编程中最基础的一个部分,也可以说是必须掌握的一个部分。话不多说,让我们开始学习吧! 首先,以一个问题作为入门:汽车有什么品牌?熟悉汽车的朋友跳出来了,说:“奔
  • JAVA————一门强大的面向对象编程语言 JAVA————一门强大的面向对象编程语言 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植
  • 【面向对象语言系列】关于 Java 音频处理,你需要知道的事
  • 什么才是最强的编程语言? 除了JAVA还有话说? 学什么语言最得劲:答案当然是Java。为啥,因为:他是跨平台的他是面向对象的他是开源的他是开发效率最高的!他是世界全能的他是使用人最多的他是最适合企业开发的不服来辩!新入行的程序猿,学什么最好?JAVA啊!.Net还想来抢生意??算了吧,你们微软就是万恶之源,你们是最不愿意贡献的JS还好意思,除了一个前端交互还能干吗?PHP就一脚本而已!企业级应用谁更适合?除了万能的Java,有谁?JS?你还能折...
  • java-面向对象编程-简介
  • 面向对象编程语言的特征
  • 我们都说java是面向对象编程语言,那什么是面向对象呢?什么是类呢?什么是方法呢? 类、对象、方法   类是对象的抽象定义,对象是类的具体实例。   类:指的是一类东西,比如汽车,人类,书等这些都指的是一类东西或物品。   对象:指类的具体的实体,比如一辆汽车,一本书等,我们要记住一切皆对象(东西)。   同时对象具有状态(属性)和行为(方法)  我以人为例:   人属性有:脸,手,脚,鼻子,耳朵,身高,性别,鼻子,耳朵等属性   人的行为(方法
  • Java中如何获取对象(引用)地址 上周有同学问,对象的hashcode是否就是它的地址?如何获取Java中一个对象地址? 首先我们来看第一个问题——对象的hashcode是否是它的地址,这个问题的答案是这个取决于具体的实现,一般来说,它常常是对象的初始地址的整数表示。我们可以从JDK中Object类中hashcode()方法的注释看出来: 其中,重点是这句 * This is typically i
  • Java语言与面向对象的程序设计 这几天很迷茫,听老师介绍了一款软件~中国大学MOOC。刚好我是软件专业的学生,索性听了北京大学老师的一节关于Java的讲课,果断被震撼到了,他们的讲课给人一种很深刻(深入)的感觉。我今天就把老师讲到的东西记了下来,以便于有兴趣的朋友阅读… Java分为三大平台 Java SE 标准版 Java EE 企业版 Java ME 微型版 Java的开发工具包 JDK(J...
  • 面向对象(Python语言,算是比较全面) 今天来总结一下面向对象吧,其实我之前已经总结过了,只不过在我自己的记事本(哈哈哈,对就是记事本,比较low),一会儿会分享给大家,然后说说面向对象,然后就当自己再复习一遍吧。 什么是面向对象?面向对象和面向过程有什么区别呢? 面向对象和面向过程都是解决问题的一种思路,简单举个例子吧: 我们要吃啤酒鸭!! 面向过程 1:养鸭子 2:等鸭子长大 3:杀了鸭子 4:买作料,自己做 5:...
  • Java中打印对象内存地址 Object的hashCode()默认是返回内存地址的,但是hashCode()可以重写,所以hashCode()不能代表内存地址的不同System.identityHashCode(Object)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。下面来验证:public class TestMem { public static void main(Strin...
  • Java类与对象地址空间分析 在进入正题之前,先说一些相关的知识。大家都知道Java除了8种基本的数据类型就只有引用类型,也就是说类属于应用类型,我们操作类的时候实际上就是操作类的地址空间,而这一切的实现过程就是引用。下面我将通过举一个例子详细分析程序运行过程中类地址空间的变化。public class Computer { String brand; float price; public Computer...
  • java 对象地址坑(作用域) 前台对象传输,试过很多方法,对象地址不变,使用下面方法可以创建新的对象使用,避免同一个对象校验完成后数据改变库存扣除错误(2次) private PurchaseManagerDto getNewPurchaseManagerDto(PurchaseManagerDto purchaseManagerDto) { String purchaseManager = JsonUtils....
  • 面对对象编程语言:应用和解释 面对对象编程语言:应用和解释 面对对象编程语言:应用和解释
  • java语言是解释型语言---一道题的详解 下面关于Java语言说法正确的有(BD)。  A、Java语言是面向对象的、解释执行的网络编程语言 B、Java语言具有可移植性,是与平台无关的编程语言 C、Java语言不能对内存垃圾自动收集 D、Java语言编写的程序虽然是“一次编译,到处运行”,但必须要有Java的运行环境   A选项:java语言是面向对象的解释型语言,但它不是网络编程语言,首先讲一下什么是解释型编程语言
  • java怎么打印一个对象的内存地址 Java一般使用HashCode来代表对象地址,但是两个相同的对象就不行了,两个相同的对象的hashcode是相同的。    如果要对比两个相同的对象地址可以使用,System.identityHashCode(传输进去的参数是一个对象) ...
  • 如何获得java对象的内存地址  在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:Java代码  package com.bijian.study;    import java.lang.reflect.Field;  import sun.misc.Unsafe;    public class Addresser {           ...
  • java方法之间参数传递(java 程序设计语言对对象采用的是引用调用吗) java方法之间参数传递 基础类型值传递 public static void tripleValue(double x){ x = 3*x; } double value = 10; tripleValue(value); System.out.println(&quot;value is:&quot;+value); //value is:10 调用tripleValue时,x仅仅是value的...
Global site tag (gtag.js) - Google Analytics