scala特质反编译java代码简单分析

最近学习了scala特质的章节简单配合着视频进行了反编译分析。

1当trait只有抽象方法,没有非抽象方法时

package day07

object demo4 {
  def main(args: Array[String]): Unit = {
    val person = new Student()
    person.say()
    person.run()
  }
}
trait Person{
  def say()
  def run()
}
class Student extends  Person {
  override def say(): Unit = {
    println("你好")
  }

  override def run(): Unit = {
    println("学生被罚跑步")
  }
}

java 底层很简单 生成了一个接口Person ,然后生成了Student继承了person 并实现了方法


import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001Q1q!\001\002\021\002G\005QA\001\004QKJ\034xN\034\006\002\007\005)A-Y=1o\r\0011C\001\001\007!\t9!\"D\001\t\025\005I\021!B:dC2\f\027BA\006\t\005\031\te.\037*fM\")Q\002\001D\001\035\005\0311/Y=\025\003=\001\"a\002\t\n\005EA!\001B+oSRDQa\005\001\007\0029\t1A];o\001")
public interface Person {
  void say();
  
  void run();
}

package day07;

import scala.Predef$;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes = "\006\001q1A!\001\002\001\013\t91\013^;eK:$(\"A\002\002\013\021\f\027\020M\034\004\001M\031\001A\002\007\021\005\035QQ\"\001\005\013\003%\tQa]2bY\006L!a\003\005\003\r\005s\027PU3g!\tia\"D\001\003\023\ty!A\001\004QKJ\034xN\034\005\006#\001!\tAE\001\007y%t\027\016\036 \025\003M\001\"!\004\001\t\013U\001A\021\t\f\002\007M\f\027\020F\001\030!\t9\001$\003\002\032\021\t!QK\\5u\021\025Y\002\001\"\021\027\003\r\021XO\034")
public class Student
  implements Person
{
  public void say() { Predef$.MODULE$.println("); }


  
  public void run() { Predef$.MODULE$.println("); }
}

如果有抽象方法和非抽象方法,继承类实现了抽象方法呢

package day07

object demo4 {
  def main(args: Array[String]): Unit = {
    val person = new Student()
    person.say()
    person.run()
  }
}
trait Person{
  def say()
  def run(): Unit ={
    println("老师跑步")
  }
}
class Student extends  Person {
  override def say(): Unit ={
    println("你好")
  }
  
}

java代码如下

同样底层现有了个personl 接口

package day07;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001Y1q!\001\002\021\002\007\005QA\001\004QKJ\034xN\034\006\002\007\005)A-Y=1o\r\0011C\001\001\007!\t9!\"D\001\t\025\005I\021!B:dC2\f\027BA\006\t\005\031\te.\037*fM\")Q\002\001C\001\035\0051A%\0338ji\022\"\022a\004\t\003\017AI!!\005\005\003\tUs\027\016\036\005\006'\0011\tAD\001\004g\006L\b\"B\013\001\t\003q\021a\001:v]\002")
public interface Person {
  void say();
  
  void run();
}

接着是不同之处了,java底层生成了一个person$class抽象类并写下了一个同名run方法

package day07;

import scala.Predef$;

public abstract class Person$class
{
  public static void $init$(Person $this) {}
  
  public static void run(Person $this) { Predef$.MODULE$.println("老师跑步"); }
}

最后Student类实现了Person类重写了抽象方法,对于非抽象方法直接调用了抽象类的方法

package day07;

import scala.Predef$;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001i1A!\001\002\001\013\t91\013^;eK:$(\"A\002\002\013\021\f\027\020M\034\004\001M\031\001A\002\007\021\005\035QQ\"\001\005\013\003%\tQa]2bY\006L!a\003\005\003\r\005s\027PU3g!\tia\"D\001\003\023\ty!A\001\004QKJ\034xN\034\005\006#\001!\tAE\001\007y%t\027\016\036 \025\003M\001\"!\004\001\t\013U\001A\021\t\f\002\007M\f\027\020F\001\030!\t9\001$\003\002\032\021\t!QK\\5u\001")
public class Student
  implements Person
{
  public void run() { Person$class.run(this); } public Student() { Person$class.$init$(this); }
  
  public void say() { Predef$.MODULE$.println("你好"); }
}

最后如果抽象方法和非抽象方法都重写呢

package day07

object demo4 {
  def main(args: Array[String]): Unit = {
    val person = new Student()
    person.say()
    person.run()
  }
}
trait Person{
  def say()
  def run(): Unit ={
    println("老师跑步")
  }
}
class Student extends  Person {
  override def say(): Unit ={
    println("你好")
  }
 override def run(): Unit ={
    println("学生被罚跑步")
  }

}

直接看代码

package day07;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001Y1q!\001\002\021\002\007\005QA\001\004QKJ\034xN\034\006\002\007\005)A-Y=1o\r\0011C\001\001\007!\t9!\"D\001\t\025\005I\021!B:dC2\f\027BA\006\t\005\031\te.\037*fM\")Q\002\001C\001\035\0051A%\0338ji\022\"\022a\004\t\003\017AI!!\005\005\003\tUs\027\016\036\005\006'\0011\tAD\001\004g\006L\b\"B\013\001\t\003q\021a\001:v]\002")
public interface Person {
  void say();
  
  void run();
}
package day07;

import scala.Predef$;

public abstract class Person$class
{
  public static void $init$(Person $this) {}
  
  public static void run(Person $this) { Predef$.MODULE$.println("老师跑步"); }
}

package day07;

import scala.Predef$;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001q1A!\001\002\001\013\t91\013^;eK:$(\"A\002\002\013\021\f\027\020M\034\004\001M\031\001A\002\007\021\005\035QQ\"\001\005\013\003%\tQa]2bY\006L!a\003\005\003\r\005s\027PU3g!\tia\"D\001\003\023\ty!A\001\004QKJ\034xN\034\005\006#\001!\tAE\001\007y%t\027\016\036 \025\003M\001\"!\004\001\t\013U\001A\021\t\f\002\007M\f\027\020F\001\030!\t9\001$\003\002\032\021\t!QK\\5u\021\025Y\002\001\"\021\027\003\r\021XO\034")
public class Student
  implements Person
{
  public Student() { Person$class.$init$(this); }
  
  public void say() { Predef$.MODULE$.println("你好"); }

 
  public void run() { Predef$.MODULE$.println("学生被罚跑步"); }

可以看出 student类继承了person类重写了say方法和run方法

最后我们可以看出在scala中特质可以有抽象方法和非抽象方法,在java底层实际上是生成了一个interface和一个抽象类,如果继承类重写了抽象方法,则直接重写,如果重写了非抽象方法则直接从抽象类中调用那个静态的非抽象方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Scala中可以很方便地使用Java代码,因此将ScalaJava代码混合打包是很常见的需求。这里介绍一种使用sbt进行混合打包的方法。 1. 创建sbt项目 首先需要创建一个sbt项目,并将Java代码Scala代码分别放到src/main/java和src/main/scala目录下。 2. 配置build.sbt文件 在build.sbt文件中添加以下内容: ``` name := "your-project-name" version := "1.0" scalaVersion := "2.12.8" javacOptions ++= Seq("-source", "1.8", "-target", "1.8") unmanagedSourceDirectories in Compile += baseDirectory.value / "src" / "main" / "java" unmanagedResourceDirectories in Compile += baseDirectory.value / "src" / "main" / "resources" libraryDependencies ++= Seq( "org.scala-lang" % "scala-library" % scalaVersion.value, "com.typesafe.akka" %% "akka-actor" % "2.5.23" ) ``` 其中,unmanagedSourceDirectories指定了Java代码的位置,unmanagedResourceDirectories指定了资源文件的位置,libraryDependencies指定了项目需要的依赖库。 3. 打包 在sbt控制台中运行以下命令即可打包: ``` sbt package ``` 打包后的jar文件位于target/scala-2.12目录下。 4. 运行 可以使用以下命令运行打包后的jar文件: ``` java -cp your-project.jar com.your.package.MainClass ``` 其中,your-project.jar是打包后的jar文件名,com.your.package.MainClass是程序入口类的全限定名。 注意:在运行时需要保证依赖库已经被正确地加载。如果依赖库没有正确加载,可以使用以下命令运行: ``` java -cp your-project.jar:lib/* com.your.package.MainClass ``` 其中,lib/*表示将lib目录下的所有jar文件都加入到classpath中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值