scala里的静态代理(static-forwarders)

大数据开发语言Scala(一)——scala入门 package: 包,等同于java中的packageobject:关键字,声明一个单例对象(伴生对象)main方法:从外部可以直接调用执行的方法def 方法名称( 参数名称 : 参数类型 ) : 返回值类型 = { 方法体 }Scala 完全面向对象,故scala去掉了Java中非面向对象的元素,如static关键字,void类型1) staticscala无static关键字,由object实现类似静态方法的功能(类名.方法名) 阅读详情

静态代理(static-forwarders)是编译器针对从java调用scala的object里的方法提供的一种便捷。

比如,我们如何在java中调用下面object里的foo方法?

$ cat A.scala 
object A {
  def foo() = 2
}

按照通常的逻辑,我们需要在java里获取到这个单例对象,然后通过这个对象调用foo方法,不过这样做的前提你需要了解object A这个单例编译后的字节码信息:

$ javap A$
Compiled from "A.scala"
public final class A$ {
  public static final A$ MODULE$;
  public static {};
  public int foo();
}

可以看到单例中有个MODULE$的静态成员,这个MODULE$就是A$的单实例,所以我们在java中可以通过这样的形式调用: A$.MODULE$.foo()

$ cat Test.java
public class Test {
    public static void main(String[] args) {
        System.out.println(A$.MODULE$.foo());
    }
}

$ javac -cp .:/data/tools/scala/lib/scala-library.jar Test.java

$ java Test
2 

上面的方式需要你了解单例对象编译后的细节,显然不够友好。所以为了对java调用的友好,scala编译器有个静态代理机制(static-forwarders),也就是会把object中的方法以静态方式在同名的class中生成一份。

依然看最开始定义的那个object A,在编译后,其实有2个class:A.class和A$.class
(scala中为了避免static的概念,引入了object,而object本质是一个模式语法糖,而非新的概念,最终在编译时都转换为java里的class)

那么看看A.class里有什么?

$ javap A
Compiled from "A.scala"
public final class A {
  public static int foo(); //一个静态foo方法
}

// 这个静态方式内部就是去找 A$.MODULE$ 然后在调用foo的 
public static int foo();
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: getstatic     #16                 // Field A$.MODULE$:LA$;
         3: invokevirtual #18                 // Method A$.foo:()I
         6: ireturn

它的目的就是为在java中调用单例对象中的方法提供方便,我们可以直接通过 A.foo()来调用

$ cat Test.java
public class Test {
    public static void main(String[] args) {
        System.out.println(A.foo());
    }
}

$ javac -cp .:/data/tools/scala/lib/scala-library.jar Test.java

$ java Test
2 

添加静态代理的过程在编译时是可以观察到的(打开log:jvm选项):

$ scalac -Ylog:jvm A.scala
[log jvm] Dumping mirror class for 'A'
[log jvm] Adding static forwarder for 'method foo' from A to 'object A'

对于伴生对象中的方法,一样会在伴生类中生成一份静态代理

原文:http://hongjiang.info/scala-static-forwarders/

【硬件相关】IB网与以太网核心技术解析及高性能网络部署指南 本文深入解析了IB网与以太网的核心技术差异,包括协议栈、流量控制机制及硬件架构,并提供了高性能网络部署的实战指南。通过对比测试和调优案例,展示了IB网在低延迟和高负载下的优势,以及混合组网中的创新应用,助力超算集群和高效网络部署。 阅读详情

相关推荐

Keil调试技巧:3种方法查看Cortex-M4的SCB寄存器(含CPUID内存映射解析)

本文详细介绍了在Keil MDK中查看Cortex-M4内核SCB寄存器的三种实战方法:使用Watch窗口进行符号化观察、通过Memory窗口直接查看物理内存映射,以及利用SFR寄存器浏览器解析位域信息。文章重点解析了CPUID寄存器的内存映射地址(0xE000ED00)及其位域含义,帮助开发者深入理解处理器身份识别与底层调试技巧,提升嵌入式系统调试效率。

h6i7j8的博客 569

Scala教程之:静态类型

文章目录泛类型型变协变逆变不变类型上界类型下界内部类抽象类型复合类型自类型隐式参数隐式转换多态方法类型推断 Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以安全、一致的方式使用抽象,我们通过下面几个特征来一一说明: 泛类型 型变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 多态方法 类型推断 通过这些特性,为安全可重用的编程抽象以及类型安全的扩展提...

程序那些事 5271

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真

文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D...

mymatin1004的博客 2万+

Scala基础

scala 中没有 static 关键字对于一个class来说,所有的方法和成员变量在实例被 new 出来之前都是无法访问的因此class文件中的main方法也就没什么用了,scala object 中所有成员变量和方法默认都是 static 的所以 可以直接访问main方法。 Scala声明变量有两种方式,一个用val,一个用var。 val / var 变量名 : 变量类型 = 变量值。 val定义的值是不可变的,它不是一个常量,是不可变量,或称之为只读变量。 创建项目中kind选项 Class:相.

weixin_48149210的博客 257

深度学习&故障诊断初学者 - 学习路线

针对初学者,一头雾水,不知如何学习,本文给出了一个学习路线 Python学习 - 打好编程基础 https://www.bilibili.com/video/BV1vA411b7Rn?spm_id_from=333.337.search-card.all.click B站免费课程 学到P49 建议时长 2周 深度学习理论 - 浅浅理解神经网络 https://www.bilibili.com/video/BV1FT4y1E74V?p=41 建议时长 2周...............

m0_47410750的博客 6万+

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 730

Scala总结

1>Java是面向对象的语言. Scala是完全面向对象的语言. 2>object : 因为Scala是完全面向对象的语言,因此很多不是...

xiaodi2016的博客 811

【2025年阿里云暑期实习(算法岗)-4月24日-第一题(100分)- 小红听歌】(题目+思路+Java&C++&Python解析+在线测试)

小红正在听歌,屏幕上同时展示着歌词和对应的播放进度条。s1t101ti​0iti​1i小红每次可以操作快进或回退一个歌词(即将播放指针向右或向左移动一个位置),数据初始时和操作过程均保证已经播放的歌词是s的一个前缀(可为空串)。她的目标是:以尽可能少的操作次数,使得字符串s中未播放状态的歌词是"幸运串"。请你计算,为了达到该目标,至少需要多少次操作?(数据保证可以在有限次内完成操作目标)【幸运串】每种字母出现的次数为指定的次数,可为空串,具体可查看输入描述。

m0_73659489的博客 114

scala详细笔记(八)-scala面向对象

本节目录 类和对象 权限修饰符 继承 抽象类和特质 样例类 匹配模式 1 类和对象 1.1类 cala语言中没有static成员存在,但是scala允许以某种方式去使用static成员 这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用不同的表达方式,class和object, 但双方具有相同的package和name,但是最终编译器会把他们编译到一起,这是纯粹从语法层面上的约定。通过javap可以反编译看到。 另外一个小魔法就是单例,单例本质上是通

HANG.NIAN 3490

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

【Transformer】小白入门指南

Transformer是起源于NLP领域,然后在图像、视频、声音等领域都得到了广泛应用的基础架构,是继MLP、CNN、RNN’后的公认的第四大基础模型结构。Transformer技术凭借其卓越的表现和广泛的应用前景,已经成为了机器学习领域的一个关键技术。自从2017年Google提出》一文以来,Transformer架构的出现彻底改变了机器学习和深度学习的格局,尤其是在处理语言模型、生成模型以及多模态学习等领域,Transformer几乎成为了不可或缺的技术基石。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 2522

scala基础7 —— scala的静态类型(object)

scala语言中是没有static关键字的,也就是说不能将类的方法或者字段声明为static,那如何实现相同的功能呢。scala提供了object关键字来实现同样的功能。

星辰大海,脚踏实地 7315

专栏二十:如何选择你的单细胞亚群的分辨率--ROGUE

ROGUE这是继chooseR后第二个计算单细胞亚群分辨率的内容,其实关于代码的运行很简单,网上已经有不少教程,重复这些就没意思了,这里主要是结合探讨一下这个算法。

m0_58549466的博客 981

scala的基础知识点

6.5.1 抽象属性和抽象方法1)基本语法​ (1)定义抽象类:abstract class Person{} //通过abstract关键字标记抽象类​ (2)定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性​ (3)定义抽象方法:def hello():String //只声明而没有实现的方法,就是抽象方法val name: String //抽象属性def hello(): Unit //抽象方法2)继承&重写。

2401_87076427的博客 2993

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

从JAVA到scala(二):消失的static关键字

scala在JAVA之上增加了很多深奥的关键,例如match、type、implicit,却抹除了我们无比熟悉的static关键字。既然没有static,那我们怎么在scala中定义类的静态方法与属性呢?真要做起来,其实比JAVA还绕(scala真的简洁吗?),具体分为以下两步: 1. 在这个类的同一份文件中添加伴生对象,也就是同名的object,注意一定要在同一份文件中; 2. 在伴生对象定义

甘焕的博客 5409

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

scala学习手记16 – scala中的static

前面两节学了scala的对象和伴生对象,这两个在使用的时候很有些java的静态成员的意思。 scala中没有静态字段和静态方法。静态成员会破坏scala所支持的完整的面向对象模型。不过可以通过伴生对象实现对scala的类一级的操作。 回过头来再看一遍那个Marker的例子,略做了一些调整: class Marker private(val color: String) { println("...

weixin_34402090的博客 213

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JAVA静态代理和动态代理理解

代理 代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。 这里写图片描述 按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。 所以,代理就有一种中间人的味道。 接下来,我们说说软件中的代理模式。 代理模式 代理模式是面向对象编程中比较常见的设计模式。 这里写图片描述 这是常见代理模式常见的

黄小龙的博客 790

scala实现代理模式

package com.linewell.modeldesgin.proxy import com.linewell.modeldesgin.dao.AccessDAO import scala.collection.mutable.ArrayBuffer /** * 代理模式 * Created by ctao on 2015/8/29. */ /** * 抽...

陈珏煊的专栏 733

scala中的动态代理

代理模式(Proxy) 动态代理:运行时动态的创建代理类(对象),并将方法调用转发到指定类(对象) 1)Proxy和InvocationHandler组合充当代理的角色 2)RealSubject是一个实际对象,它实现接口subject 3)在使用时,我们不希望直接访问RealSubject的对象,比如:我们对这个对象的访问是有控制的 4)我们使用动态代理,在程序中通过动态代理创建RealSubject对象,并完成调用 5)动态代理可以根据需要创建多种组合 6)Proxy也会实现Subject接口的方法,

m0_46504700的博客 444

动态代理与Scala反射/Java反射在Java、Scala、Kotlin中的使用

一、Java反射 被代理对象 这个也是我使用graphql-java-codegen生成的一个resolver,这里我们需要了解这些,只知道我们有个接口,其中有个方法,需要被动态代理使用即可。 public interface QueryResolver { UserTO user(String login) throws Exception; } InvocationHandler实现 通常我们在Java中使用,实现InvocationHandler接口。如下: final public cla

梦境迷离 533

Scala中的静态方法的调用

1. 单例对象 Scala没有静态方法或静态字段,可以用object这个语法结构来达到同样的目的,对象定义了某个类的单个实例,包含了你想要的特性。 例如: object Accounts{      private var lastNumber = 0      def newUniqueNumber()={lastNumber+=1;lastNumber} }

tsyx163的博客 6654

Scala 函数响应式编程: 静态类型 (Static Types)

藉由编译器形成一过滤器; 只让符合领域模型中商业规则的参数类型, 能传入到函数中

产品级敏捷 2.0: 用户的想法与产品之间的那条最短的路径 3060

scala-第八章-Scala隐式转换

目录 隐式转换概述 隐式转换实战 隐式参数 隐式类 隐式转换概述 什么是隐式转换 需求:为一个已存在的类添加一个新的方法 Java:动态代理 scala:隐式转换 双刃剑 spark/Hive/MapReduce 调优 隐式转换实战 package com.imooc.scala.course08 import java.io.File import ImplicitAspect._ object ImplicitApp extends App { //定

CZW的博客 193

Sping中的两个概念:IoC 和 AOP

CGlib概述:cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。cglib封装了asm,可以在运行期动态生成新的class。cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。CGlib应用:以一个实例在简单介绍下cglib的应用。我们模拟一个虚拟的场景,关于信

1021

CGLib动态代理原理及实现

  JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。    简单的实现举例: 这是一个需要被代理的类,也就是父类,通...

waiting13的博客 395

Scala—— 8.伴生对象(静态属性、静态方法)

Scala中静态的概念是伴生对象。Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象。这个类的所有静态内容都可以放置在它的伴生对象中声明和调用。 object boke_demo01 { def main(args: A...

blueicex2017的博客 953
上一篇: scala:函数即对象
下一篇: Looking "Under the Hood" with javap
DViewer
博客等级 码龄16年 16粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值