Java编程语言是Android应用程序开发中最古老,最喜欢的语言。但是,在Google I / O 2017期间,Kotlin已被Google Android团队宣布为Android开发的官方语言。 Kotlin由于其相似性以及与Java语言的互操作性而在开发人员中迅速流行。在设计一个Android项目时,可以将Java和Kotlin的代码混合在一起。 Java和Kotlin的语法在很多方面都不同,但是它们的编译过程几乎相同。两种语言的代码都被编译成可在Java虚拟机(JVM)上执行的字节码。因此,如果可以导出已编译的Kotlin文件的字节码,则可以对其进行反编译以生成等效的Java代码。 Android Studio所做的工作与从Kotlin到Java的代码转换完全相同。开发人员可能有很多理由将Kotlin代码转换为Java,例如:
- 集成易于用Java语言实现的功能。
- 解决一些在Kotlin中很难找到的性能问题。
- 从项目文件中删除Kotlin代码。
代码转换
第1步:打开Kotlin类/文件
打开要转换为Java的Kotlin类/文件。考虑下面提到的MainActivity文件的代码进行转换。
Kotlin
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
// declaring variable for TextView component
private var textView: TextView? = null
// declaring variable to store
// the number of button click
private var count = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// assigning ID of textView2 to the variable
textView = findViewById(R.id.textView2)
// initializing the value of count with 0
count = 0
}
// function to perform operations
// when button is clicked
fun buttonOnClick(view: View?) {
// increasing count by one on
// each tap on the button
count++
// changing the value of the
// textView with the current
// value of count variable
textView!!.text = Integer.toString(count)
}
}
Java
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.Nullable;
@Metadata(
mv = {1, 4, 1},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000,\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\b\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u0010\u0010\u0007\u001a\u00020\b2\b\u0010\t\u001a\u0004\u0018\u00010\nJ\u0012\u0010\u000b\u001a\u00020\b2\b\u0010\f\u001a\u0004\u0018\u00010\rH\u0014R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\u0005\u001a\u0004\u0018\u00010\u0006X\u0082\u000e¢\u0006\u0002\n\u0000¨\u0006\u000e"},
d2 = {"Lcom/example/javatokotlin/MainActivity;", "Landroidx/appcompat/app/AppCompatActivity;", "()V", "count", "", "textView", "Landroid/widget/TextView;", "buttonOnClick", "", "view", "Landroid/view/View;", "onCreate", "savedInstanceState", "Landroid/os/Bundle;", "app"}
)
public final class MainActivity extends AppCompatActivity {
private TextView textView;
private int count;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(1300009);
this.textView = (TextView)this.findViewById(1000069);
this.count = 0;
}
public final void buttonOnClick(@Nullable View view) {
int var10001 = this.count++;
TextView var10000 = this.textView;
Intrinsics.checkNotNull(var10000);
var10000.setText((CharSequence)Integer.toString(this.count));
}
}
第2步:导航到“工具”菜单
从Android Studio的最顶部工具栏中,选择工具,然后导航到Kotlin>显示Kotlin字节码。它将在右侧打开一个窗口,其中包含Kotlin文件的逐行字节码。
步骤3:反编译字节码
在字节码窗口中,选中选项“ JVM 8 target” ,然后单击“ Decompile”。 Android Studio将为Kotlin文件生成Java等效代码。产生的Java代码将包含一些其他信息,例如元数据。以下是上述Kotlin文件生成的Java代码。
Java
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.Nullable;
@Metadata(
mv = {1, 4, 1},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000,\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\b\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u0010\u0010\u0007\u001a\u00020\b2\b\u0010\t\u001a\u0004\u0018\u00010\nJ\u0012\u0010\u000b\u001a\u00020\b2\b\u0010\f\u001a\u0004\u0018\u00010\rH\u0014R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\u0005\u001a\u0004\u0018\u00010\u0006X\u0082\u000e¢\u0006\u0002\n\u0000¨\u0006\u000e"},
d2 = {"Lcom/example/javatokotlin/MainActivity;", "Landroidx/appcompat/app/AppCompatActivity;", "()V", "count", "", "textView", "Landroid/widget/TextView;", "buttonOnClick", "", "view", "Landroid/view/View;", "onCreate", "savedInstanceState", "Landroid/os/Bundle;", "app"}
)
public final class MainActivity extends AppCompatActivity {
private TextView textView;
private int count;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(1300009);
this.textView = (TextView)this.findViewById(1000069);
this.count = 0;
}
public final void buttonOnClick(@Nullable View view) {
int var10001 = this.count++;
TextView var10000 = this.textView;
Intrinsics.checkNotNull(var10000);
var10000.setText((CharSequence)Integer.toString(this.count));
}
}
Note: The Kotlin to Java code conversion will not create a new file in the project directory from where one can access the Java code. Thus to use the Android Studio genereated Java code, one needs to copy it from the displayed decompiled java file.
Java优于Kotlin的优势
- 操作员超载是不可能的。
- 默认情况下,用Java编写的类未设置为final。
- 更具可读性的语法。
- 使用静态方法和变量。