首页
学习
活动
专区
圈层
工具
发布

Java学习笔记_零基础系列(十一)Java对象的创建及使用方法

✔上一篇Java零基础系列文章我们说到了Java中的面向对象,今天这篇文章主要围绕下边几个知识点: Java对象的创建和使用方法 为什么要画内存图?(非常重要) 程序在什么情况下会出现空指针异常呢?...Java方法调用时参数的传递问题 构造方法 1、Java对象的创建和使用方法 这块我们主要十理解构造方法以及重载机制,通过构造方法可以完成对象的创建,并且能够通过引用访问对象的内存,了解Java虚拟机内存管理...类定义之后,就可以使用类这个“模板”来创造“对象”了,一个类是可以创建多个对象的哦!怎么创建呢,语法是什么? 其实语法格式很简单:new 类名(),这样就可以完成对象的创建了。...接下来解释一下以上的输出结果,通过以上的Student类可以创建很多学生对象,假设通过Student类实例化了两个学生对象,那必然会有两个不同的学号,以上程序中并没有给学号赋值,但是获取了到的学号都是...这是因为在java语言当中,当实例变量没有手动赋值,在创建对象的时候,也就是说在new的时候,系统会对实例变量默认赋值,它们的默认值请参考下表: 数据类型 默认值 byte 0 short 0 int

68020

Object o = new Object()在内存中占多少字节?

如何知道一个对象在内存中的大小呢?C语言有个叫sizeOf的东西,很方便就能知道对象大小。但是Java没有这样的东西啊,不慌,Java本身有一个Agent技术。...有一个jvm虚拟机,还有一个class要load到内存,在load内存的过程中可以加一个Agent代理,这个代理可以截获这些class文件(001 010等二进制码),并可以对他做任意修改,当然也就可以读取到整个...写一个agent类,格式一般比较固定 public class ObjectSizeAgent { //Java内部字节码处理调试用的是Instrumentation //所以在使用代理装到我们...jvm的时候可以截获这个Instrumentation private static Instrumentation inst; /** * 必须要有premain函数...对象在内存中的布局 作为对象的内存布局来讲分为两种,一种是普通对象,一种是数组对象。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )

    成员 二、Instrumentation 代理类 1、持有被代理实例对象 2、代理执行 execStartActivity 方法 3、截获 Activity 实例对象 4、替换 Activity 中的...字段 , 使用我们自定义的 Instrumentation 代理类 , 替换实际的 Instrumentation 实例对象 ; // 反射获取 ActivityThread 对象中的...// 获取 ActivityThread 中的 mInstrumentationObj 成员, 创建 Instrumentation 静态代理时使用 Instrumentation...代理类中 , 持有被代理的对象 , 有一些操作需要使用原来的 Instrumentation 进行操作 , 在构造方法中注入被代理对象 ; /** * 持有被代理对象 *...Activity 实例对象 newActivity 方法是创建 Activity 实例对象的方法 , 在该方法中可以获取到创建的 Activity 对象 ; /** * 在该方法中

    1.3K50

    面试官再问new Object在内存中占多少字节,你得这么答...

    ---- 如何知道一个对象在内存中的大小呢?C语言有个叫sizeOf的东西,很方便就能知道对象大小。但是Java没有这样的东西啊,不慌,Java本身有一个Agent技术。...jvm虚拟机,要load一个class到内存,在load内存的过程中可以加一个Agent代理,这个代理可以截获这些class文件(001 010等二进制码),并可以对他做任意修改,当然也就可以读取到整个...写一个agent类,格式一般比较固定 public class ObjectSizeAgent { //Java内部字节码处理调试用的是Instrumentation //所以在使用代理装到我们...jvm的时候可以截获这个Instrumentation private static Instrumentation inst; /** * 必须要有premain函数...对象在内存中的布局 作为对象的内存布局来讲分为两种,一种是普通对象,一种是数组对象。

    93020

    话说 面试题连环问

    一、 请解释一下对象的创建过程 在前边 “话说 类加载过程”的文章中已经介绍过了类加载过程 创建对象的时候会先去判断类是否已经加载, 如果没有加载的话会先加载类, 如果已经加载就会直接创建对象...执行构造方法语句 (super先行) [面试题01.png] 二、 对象在内存中的布局 1....有趣的实验 看对象大小 agent 字节码文件在加载到内存的时候可以用一个agent截取到二进制的字节码,然后可以对字节码进行修改,也可以获取大小 [agent.jpg] 定义class...instrumentation = _instrumentation; } // 调用getObjectSize方法获取对象大小...深入理解java虚拟机中有一张图: [location.jpg] 第一种:变量指向一个句柄 这个句柄指向堆对象+对象数据类型(方法区) GC算法可能比较快 第二种(hotspot

    38800

    【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 源码分析 )

    1 个应用对应 1 个 LoadedApk ; LoadedApk 是 apk 安装文件在内存中的数据 , 可以在 LoadedApk 中得到 apk 文件中的 代码 资源文件 Activity..., Service 等组件 Manifest 配置文件 等 所有封装在 apk 文件中的信息 ; LoadedApk.java 中的 makeApplication 方法的作用就是 创建 Application...) { LoadedApk 中有一个 mApplication 成员 , private Application mApplication , 该成员就是应用的 Application 对象 ; 如果...; 应用跳转 Application , 发送模拟按键 , 都需要使用到 mActivityThread.mInstrumentation , Instrumentation 是一个工具类 , 其可以创建...类参考源码 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java 常用方法 : newActivity

    1.1K01

    探秘Java:用ByteBuddy编写一个简单的Agent

    由于ByteBuddy提供了一系列完善且便捷的API,使用者可以在不需要了解Java字节码和class文件格式的情况下很方便地进行字节码操作(通过使用Java Agent或者在程序构建时完成对应的操作)...二、编写一个简单的Java Agent——方法耗时统计   从上面的描述中我们可以了解到,ByteBuddy的诞生并非单纯为了创建Java Agent,我们只是借助了ByteBuddy提供的API来生成更易维护的...下面我们要编写的Java Agent主要是用于进行方法执行的耗时统计,参考以往使用AOP方式的思路,我们需要进行以下处理: 指定需要拦截处理的对象(可以是类、方法或者被注解的元素); 明确如何处理拦截的对象...看到这里是否会感觉和代理模式(或者说我们常用的AOP)有些类似,尤其是TimeInterceptor当中的处理逻辑,只是在这一过程中并没有使用反射机制,这也是使用ByteBuddy的一个优势; 最后,在完成了对于拦截对象的指定和对象处理逻辑的编写后...三、总结   本文更多在于介绍ByteBuddy的概要和使用ByteBuddy创建Java Agent的使用流程,对于ByteBuddy具体的原理这里不做过多的说明,在后续的篇章中会进行具体的介绍。

    2.9K40

    Android插件化原理之Activity插件化

    Hook技术实现主要有两种解决方案 ,一种是通过Hook IActivityManager来实现,另一种是Hook Instrumentation实现。...普通Activity和根Activity的启动过程大同小异,但是没有这么复杂,因为不涉及应用程序进程的创建,跟Laucher也没关系,如下图所示。 ?...可以采用预先占坑的方式来解决没有在AndroidManifest.xml中显示声明的问题,具体做法就是在上图步骤1之前使用一个在AndroidManifest.xml中注册的Activity来进行占坑,...看到这里我们可以得到方案,就是在Instrumentation的execStartActivity方法中用占坑SubActivity来通过AMS的验证,在Instrumentation的newActivity...方法中还原TargetActivity,这两部操作都和Instrumentation有关,因此我们可以用自定义的Instrumentation来替换掉mInstrumentation。

    1.5K50

    使用代理(Agent)的Java Bytecode Instrumentation:在运行时侵入Java应用程序(2)

    Java agent是一种以特定方式捆绑的应用程序,通常作为一个独立的JAR文件(它可能还需要额外的依赖项)交付,它包含instrumentation逻辑的实现,并且可以为了instrumentation...JVM提供了使用上述任一方法加载Java代理的简便方法,但是它没有提供卸载Java代理的便捷方法。原因是,Java代理本身是一组特定的类,这些类在Java代理启动期间使用类加载机制加载到JVM中。...如果一个代理需要支持上述两种Java代理启动方式,那它可以实现两种方法; 代理类并没有真正实现任何特定的Java接口,但是实现的方法premain() / agentmain()必须符合预期的方法声明...在下面的示例中,我开发了一个Java代理,它可以以上述任何一种方式启动,并实现与前面示例中相同的instrumentation逻辑。...应当指出的是,对该类的字节码instrumentation成功了,这是因为它不但被类加载器加载到JVM中,还在instrumented类第一次被访问和加载(发生在类的一个对象实例创建时)之前加载了java

    1.8K61

    字节码调试的入口 —— JVM 的寄生插件 javaagent 那些事

    本文会分为 javaagent 和动态 Attach 两个部分来介绍 Java Instrumentation 核心方法 Instrumentation 是 java.lang.instrument 包下的一个接口...Javaagent 介绍 Javaagent 是一个特殊的 jar 包,它并不能单独启动的,而必须依附于一个 JVM 进程,可以看作是 JVM 的一个寄生插件,使用 Instrumentation 的...第二个 instrumentation 是 java.lang.instrument.Instrumentation 的实例,可以通过 addTransformer 方法设置一个 ClassFileTransformer...,代码中有一个 main 方法,每隔 3s 输出 foo 方法的返回值 100,接下来动态 Attach 上 MyTestMain 进程,修改 foo 的字节码,让 foo 方法返回 50。..." + pid); createAttachFile(attachFile.getPath()); } 2、Attach 端检查如果没有 .java_pid12345 文件,创建完 .attach_pid12345

    1.3K20

    让你吊打面试官的Java内存结构以及对象的内容讲解

    框架就是利用了这一点) 乱序问题(读): CPU乱序执行的问题:如果没有直接依赖关系 为了提高效率 在一条指令执行的过程中(读数据慢100倍),去同时执行另外一条指令 WCBuffer(4个位置):写操作也可以进行合并...调用构造方法 成员变量顺序赋初始值 执行构造方法语句 对象在内存的存储布局: 首先查看自己虚拟机的配置:java-XX:+PrintCommandLinesFlags -version...红色的参数就是内存布局 对象的内容(对象的内存部局也可以这么说): 普通对象 1....对其8的倍数 首先一个class load到内存的时候有一个agent 来截获或者修改 需要自己实现它(premain 方法) 相当于代理 实验: 1....Oops (ordinary object pointers) 2. 32G,压缩无效,使用64位 内存并不是越大越好(^-^) 对象头具体包含什么: 具体看对象的状态 当一个对象计算过identityHashCode

    25120

    Java高级用法,写个代理侵入你 ?

    这种类的实现方式其实是一种 Java Agent 技术,我们这里可以顺带了解一下什么是 Java Agent。...” 一起传入的程序参数,如果这个字符串代表了多个参数,就需要自己解析这参数,inst 是 Instrumentation 类型的对象,是 JVM 自己传入的,我们可以 拿这个参数进行参数的增强操作。...2、声明方法 当定义完这两组方法后,要使之生效还需要手动声明,声明方式有两种: 1、使用 MANIFEST.MF 文件 我们需要创建resources/META-INF.MANIFEST.MF 文件,当...Java Instrumentation 来完成动态类修改的功能,并且在 Instrumentation 接口中我们可以通过 addTransformer() 方法来增加一个类转换器,类转换器由类 ClassFileTransformer...该接口中有一个唯一的方法 transform() 用于实现类的转换,也就是我们可以增强类处理的地方!

    65810

    深入理解Instrument(一)

    Instrumentation可以实现在方法插入额外的字节码从而达到收集使用中的数据到指定工具的目的。由于插入的字节码是附加的,这些更变不会修改原来程序的状态或者行为。...如何使用Instrumentation Instrumentation类在API注释中有十分简洁的使用方式描述: 有两种方式可以获取Instrumentation接口的实例: JVM在指定代理的方式下启动...JVM提供一种在启动之后的某个时刻启动代理的机制,此时Instrumentation实例会传递到代理类代码的agentmain方法。...可以修改方法体。 除了上面的方式,如果想要重新定义一个类,可以考虑基于类加载器隔离的方式:创建一个新的自定义类加载器去通过新的字节码去定义一个全新的类,不过也存在只能通过反射调用该全新类的局限性。...小结 本文仅仅简单分析instrument的原理和基本使用,可以体会到instrument让Java具有了更强的动态控制、解释能力,从而让Java语言变得更加灵活多变。

    3.4K31

    Android Hook技术详解

    ,所有的代码调用和回调都是按照一定顺序执行的,Hook技术存在的意义就在于,我们可以在事件传送到终点前截获并监控该事件的传输,并且做一些自己的处理,可以简单的理解为把一件事中间拦截掉了,然后搞了点自己的小动作然后让他继续走下去...然后会在ActivityThread中的performLaunchActivity方法里调用mInstrumentation的newActivity方法用类加载器创建Activity的实例,我们可以在这里把它替换成我们要跳转的...在看Toast.java源码的过程中,我们会发现,Toast的展示并不是自己控制的,而是通过AIDL使用INotificationManager中的NotificationManagerService控制的...这个crash我在跑demo的时候的时候使用让ui线程休眠的方式在Android 7.1.1的虚拟机上没有复现出来,朋友们可以参考腾讯这篇文章Toast问题深度剖析(一),有复现出来的朋友欢迎评论区一起交流...所以,如果要模拟这个问题,完美只要引用一个重写了finalize方法的实例,并且在finalize方法中有耗时操作,然后我们手动GC就可以了。

    4.1K60

    【Java编程进阶之路 04】深入探索:Java类加载器与双亲委派 & 打破双亲委派桎梏

    返回Class对象:无论是由父类加载器还是子类加载器加载的类,最终都会返回对应的Class对象,这个对象可以被用来创建类的实例或访问类的静态成员。...5.3 使用Java Agent和Instrumentation API Java Agent是一种特殊的JAR文件,可以在JVM启动时或运行时被加载。...使用Java Agent和Instrumentation API可以让我们在运行时修改类的字节码,这提供了一种方式来打破双亲委派模型。...以下是如何使用Java Agent和Instrumentation API来打破双亲委派模型相关示例: 步骤 1: 编写一个Java Agent 首先,你需要创建一个包含premain方法的Java类。...sh复制代码java -javaagent:myagent.jar MyApplication 步骤 4: 使用Instrumentation API进行字节码操作 在premain方法中,你可以使用Instrumentation

    50311

    skywalking源码分析之javaAgent工具ByteBuddy的应用

    Instrumentation参数可以用来执行一系列的任务,比如确定对象以字节为单位的精确大小以及通过注册ClassFileTransformers实际修改类的实现。...; 当然,这个生成的类并没有太大的用处。对于实际的应用来讲,大多数方法的返回值是在运行时计算的,这个计算过程要依赖于方法的参数和对象的状态。...通过委托实现Instrumentation 要实现某个方法,有一种更为灵活的方式,那就是使用Byte Buddy的MethodDelegation。...功能的子类是在运行时创建的,所以除了使用Java反射以外,没有其他办法创建这样的实例。...这样造成的结果就是,子类instrumentation通常会用于框架之中,这些框架本身就需要通过工厂来创建实例,例如,像依赖管理的框架Spring或对象-关系映射的框架Hibernate,而对于其他类型的应用来讲

    3.6K80

    认识 JavaAgent --获取目标进程已加载的所有类

    2.JVM提供一种在启动之后的某个时刻启动代理的机制,此时Instrumentation实例会传递到代理类代码的agentmain方法。...idea打包,也可以使用maven插件打包),在idea可以像下面这样启动: ?...idea打包,也可以使用maven插件打包),首先启动Testmain,然后先列下当前有哪些Java程序: ?...也就是说某个类之前没有加载过,那么都会通过两者设置的transform,这可以从最后的java/lang/Shutdown看出来。...Instrumentation 局限性 大多数情况下,使用Instrumentation都是使用其字节码插桩的功能,笼统说是类重转换的功能,但是有以下的局限性: 1.premain和agentmain两种方式修改字节码的时机都是类文件加载之后

    2.6K10
    领券