কীভাবে কোনও কোটলিন উত্স ফাইলটিকে জাভা উত্স ফাইলে রূপান্তর করা যায়


390

আমার কাছে একটি কোটলিন উত্স ফাইল রয়েছে তবে আমি এটি জাভাতে অনুবাদ করতে চাই।

আমি কীভাবে কোটলিনকে জাভা উত্সে রূপান্তর করতে পারি?


10
আমি নিশ্চিত যে এর জন্য কোনও স্বয়ংক্রিয় সরঞ্জাম তৈরি করা হয়নি। আপনি এটি প্রথম তৈরি করতে পারেন!
এরিক কোচরান

7
এটি খুব সম্ভবত যে আপনি একটি কুরুচিপূর্ণ এবং অকল্পনীয় জাভা ক্লাস দিয়ে শেষ করবেন যা আপনার ক্লাসপথে কোটলিন স্ট্যান্ডার্ড লাইব্রেরি না থাকলে চলবে না। আলোচ্য বিষয়টি কি?
ইওল

3
J2objC অনুবাদক বিবেচনা করুন। আপনি কোটলিন -> জাভা -> objজেক্টি
প্যাট্রিক

3
"ডিকম্পাইল" বোতামটির লক্ষ্য হ'ল কোটলিন সংকলন কীভাবে কাজ করে তা মানুষকে বুঝতে সহায়তা করা। এটি যে জাভা কোডটি উত্পন্ন করে তা প্রকৃত উত্পাদন কোড হিসাবে ব্যবহারের উদ্দেশ্যে নয় (এবং এটির জন্য যথেষ্ট খারাপভাবে উপযোগী - এটি শুরু করার জন্য এটি সর্বদা সংকলন করে না ...)
ইয়োল

2
@ ইয়োল এমন একজনের জন্য কীভাবে আছেন যিনি কোটলিন জানেন না বা এটি শিখার জন্য সময় পেয়েছেন এবং সেই ভাষাতে কিছু নমুনা কোড পেয়েছেন যার কিছুটা কার্যকারিতা রয়েছে যা তাদের জাভা কোডটি কাজ করার জন্য বুঝতে হবে?
মাইকেল

উত্তর:


400

@ ভ্যাডজিম যেমন বলেছিলেন, ইন্টেলিজজে বা অ্যান্ড্রয়েড স্টুডিওতে কোটলিন থেকে জাভা কোড পেতে আপনাকে কেবল নিম্নলিখিতটি করতে হবে:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. দেখার জন্য ক্লিক করুন Decompileবাটন
  3. জাভা কোডটি অনুলিপি করুন

হালনাগাদ:

কোটলিন প্লাগইনের সাম্প্রতিক সংস্করণ (1.2+) এর সাহায্যে আপনি সরাসরিও করতে পারেন Menu > Tools > Kotlin -> Decompile Kotlin to Java


60
জাভা আউটপুট কি কুরুচিপূর্ণ নয়?
পেসারিয়ার

20
@ পেসারিয়র যেমন বেশিরভাগ পচনশীল আউটপুটগুলির মতো হয় তবে এটি অবশ্যই হয়
লুই সিএডি

5
কোটলিন থেকে জাভাতে রূপান্তরিত। তবে এটি অতিরিক্ত কোড দেখাচ্ছে। আমি যে কোডটি কখনও
লিখিনি

20
এই বিকল্পটি সক্ষম নয়, এটি ধূসর বর্ণের। আমি কীভাবে এটি সক্ষম করব।
বিকাশ পান্ডে

8
@ ভিকাসপান্ডে, Decompile Kotlin to Javaবর্তমানে কেবল সংকলিত কোটলিন ক্লাসের জন্যই সক্ষম রয়েছে ।
ওনিক

39

আপনি কোটলিনকে বাইটকোডে সংকলন করতে পারেন, তারপরে একটি জাভা ডিসেসেমব্লার ব্যবহার করুন।

পচনের কাজটি ইন্টেলিজ আইডিয়াতে বা ফার্নফ্লোয়ার https://github.com/fesh0r/fernflower (ধন্যবাদ @ জিরে) ব্যবহার করে করা যেতে পারে

কয়েক মাস আগে আমি পরীক্ষা করেছিলাম বলে কোনও স্বয়ংক্রিয় সরঞ্জাম ছিল না (এবং একটি আফ্রিকের জন্য কোনও পরিকল্পনা নেই)


2
পার্শ্ব নোট হিসাবে, সচেতন থাকুন যে উত্পন্ন কোডের জেনেরিকগুলি সংকলক সতর্কতাগুলির কারণ হতে পারে, যেহেতু কোটলিন কিছু জিনিস জাভা সংকলক না দেয় allows এটি এখনও বাইট কোডে কাজ করে।
জ্যাকব জিমারম্যান

@ ভোদান আমাকে মনে হয় তিনি রিফাইড জেনেরিকের কথা উল্লেখ করছেন, যা খাঁটি জাভার কোনও সম্ভাবনা নয়।
জিরে 24'16

1
@ জিয়ার রিফাইড জেনেরিকগুলি সর্বদা ইনলাইনড থাকে, তাই জাভা থেকে এগুলি দেখতে সাধারণ শ্রেণীর রেফারেন্সগুলির মতো
লাগে


4
ইন্টেলিজ আইডিয়া 2016.2: মেনু / সরঞ্জাম / কোটলিন / কোটলিন বাইটকোড প্রদর্শন করুন, তারপরে ডেকম্পাইল বোতামটি ক্লিক করুন
ভাদজিম


7

একটি Kotlinউত্স ফাইলকে উত্স ফাইলে রূপান্তর করতে Javaআপনার প্রয়োজন (যখন আপনি অ্যান্ড্রয়েড স্টুডিওতে আছেন):

  1. প্রেস Cmd- Shift- Aএকটি ম্যাক, অথবা টেপার Ctrl- Shift- Aউইন্ডোজ মেশিনে।

  2. আপনি যে ক্রিয়াটি সন্ধান করছেন তা টাইপ করুন: Kotlin Bytecodeএবং Show Kotlin Bytecodeমেনু থেকে চয়ন করুন ।

এখানে চিত্র বর্ণনা লিখুন

  1. প্যানেলের Decompileউপরে বোতাম টিপুন Kotlin Bytecode

এখানে চিত্র বর্ণনা লিখুন

  1. এখন আপনি সংলগ্ন ট্যাবে কোটলিন ফাইলের সাথে একটি ডিসম্পিল্ড জাভা ফাইল পাবেন:

এখানে চিত্র বর্ণনা লিখুন


1
ধন্যবাদ জনাব! এই বগি এএস আবার সাধারণ সরঞ্জামগুলি (সরঞ্জামসমূহ> কোটলিন> ...) পরিবর্তন করেছে।
কুলমাইন্ড

5

আমি কোটলিনকে বাইট কোড করতে কম্পাইল করে তারপরে জাভাতে ডি-কম্পাইল করি। আমি কোটলিন সংকলক এবং সিএফআর দিয়ে ডি-সংকলন সংকলন করি ।

আমার প্রকল্প এখানে

এটি আমাকে এটি সংকলন করতে দেয়:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

tailrec fun findFixPoint(x: Double = 1.0): Double =
        if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

এটি:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive;

public final class ExampleKt {
  public static final double findFixPoint(double x) {
    while (x != Math.cos(x)) {
      x = Math.cos(x);
    }
    return x;
  }

  public static /* bridge */ /* synthetic */ double findFixPoint$default(
      double d, int n, Object object) {
    if ((n & 1) != 0) {
      d = 1.0;
    }
    return ExampleKt.findFixPoint(d);
  }
}

4

@ লুইস-ক্যাড হিসাবে উল্লেখ করা হয়েছে "কোটলিন উত্স -> জাভার বাইট কোড -> জাভা উত্স" এখন পর্যন্ত একমাত্র সমাধান।

তবে আমি যে উপায়টি পছন্দ করি তা উল্লেখ করতে চাই: অ্যান্ড্রয়েডের জন্য জ্যাডেক্স ডিকম্পিলার ব্যবহার করে ।

এটি ক্লোজারগুলির জন্য উত্পন্ন কোডটি দেখতে দেয় এবং আমার হিসাবে, ফলাফল কোডটি "ক্লিনার" হয় তারপরে ইন্টেলিজ আইডিইএ ডিকম্পিলার থেকে একটি।

সাধারণত যখন আমার কোনও কোটলিন শ্রেণীর জাভা উত্স কোডটি দেখতে হয়:

  • Apk উত্পন্ন করুন: ./gradlew assembleDebug
  • জ্যাডেক্স জিইউআই ব্যবহার করে এপিকে খুলুন: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

এই জিইউআইতে বেসিক আইডিই কার্যকারিতা কাজ করে: শ্রেণি অনুসন্ধান, ঘোষণার জন্য ক্লিক করুন। প্রভৃতি

এছাড়াও সমস্ত উত্স কোড সংরক্ষণ করা যায় এবং তারপরে ইন্টেলিজ আইডিইএর মতো অন্যান্য সরঞ্জাম ব্যবহার করে দেখা যায়।


ভাল, এটি brew install jadx
হোমব্রুউয়ের

2
  1. অ্যান্ড্রয়েড স্টুডিওতে কোটলিন ফাইল খুলুন
  2. সরঞ্জামগুলিতে যান -> কোটলিন -> কোটলিন বাইকোড
  3. আপনার কোটলিন ফাইলের পাশে যে নতুন উইন্ডোটি খোলে, ডিকম্পাইল বোতামটি ক্লিক করুন। এটি আপনার কোটলিন ফাইলের সমতুল্য জাভা তৈরি করবে।

2

জাভা এবং কোটলিন জাভা ভার্চুয়াল মেশিনে (জেভিএম) চালায়।

কোটলিন ফাইলটিকে জাভা ফাইলে রূপান্তরকরণের মধ্যে দুটি পদক্ষেপের অর্থ জেটিএম বাইটকোডে কোটলিন কোডটি সংকলন করা এবং তারপরে জাভ কোডে বাইটকোডটি সংহত করে।

আপনার কোটলিন উত্স ফাইলটি জাভা উত্স ফাইলে রূপান্তর করার পদক্ষেপ:

  1. অ্যান্ড্রয়েড স্টুডিওতে আপনার কোটলিন প্রকল্পটি খুলুন।
  2. তারপরে সরঞ্জামগুলিতে নেভিগেট করুন -> কোটলিন -> কোটলিন বাইটকোড দেখান।

এখানে চিত্র বর্ণনা লিখুন

  1. আপনি আপনার কোটিন ফাইলের বাইকোড পাবেন।
  2. বাইকোড থেকে আপনার জাভা কোডটি পেতে এখন ডিকম্পাইল বোতামে ক্লিক করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.