জাভায় সিনথেটিক ক্লাস


143

জাভাতে সিনথেটিক শ্রেণি কী? কেন এটি ব্যবহার করা উচিত? আমি কীভাবে এটি ব্যবহার করতে পারি?


1
সমস্ত "আপনার কোডে নেই" উত্তরগুলি জাভা 8 এর সাথে পুরানো, কারণ ল্যাম্বডাস সিন্থেটিক (বেনামে নয়) শ্রেণি হিসাবে প্রয়োগ করা যেতে পারে।
অরেঞ্জডগ

ন্যায়সঙ্গত হওয়ার জন্য, একটি ল্যাম্বদা এখনও আপনার কোডের মধ্যে স্পষ্টভাবে সংজ্ঞায়িত একটি শ্রেণি "কঠোরভাবে" হয় না। সুতরাং, "আপনার কোডে নেই" এখনও বৈধ। সংকলকটি আপনার কোডের সুস্পষ্ট সংজ্ঞা ছাড়াই আপনার জন্য সিন্থেটিক ক্লাস তৈরি করে।
মানোডেস্ট্র্রা

উত্তর:


15

উদাহরণস্বরূপ, যখন আপনার একটি স্যুইচ স্টেটমেন্ট থাকে, জাভা একটি পরিবর্তনশীল তৈরি করে যা একটি with দিয়ে শুরু হয় $ আপনি যদি এর উদাহরণ দেখতে চান তবে জাভা প্রতিবিম্বটি একটি শ্রেণীর কাছে দেখুন যাতে এটিতে একটি স্টিচ স্টেটমেন্ট থাকে। ক্লাসের যে কোনও জায়গায় আপনার কমপক্ষে একটি সুইচ স্টেটমেন্ট থাকলে আপনি এই ভেরিয়েবলগুলি দেখতে পাবেন।

আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আমি বিশ্বাস করি না যে আপনি সিন্থেটিক ক্লাসগুলিতে (প্রতিচ্ছবি ব্যতীত) অ্যাক্সেস করতে সক্ষম হয়েছেন।

আপনি যদি এমন কোনও শ্রেণীর বিশ্লেষণ করছেন যা আপনি (প্রতিবিম্বের মাধ্যমে) সম্পর্কে কিছু জানেন না এবং সেই শ্রেণিটি সম্পর্কে খুব সুনির্দিষ্ট এবং নিম্ন-স্তরের জিনিসগুলি জানা প্রয়োজন, আপনি জাভা প্রতিবিম্ব পদ্ধতিগুলি ব্যবহার করতে পারেন যা সিন্থেটিক ক্লাসগুলির সাথে করতে হবে। আপনার কোডটিতে যথাযথভাবে ব্যবহার করার জন্য এখানে কেবলমাত্র "ব্যবহার" ক্লাস সম্পর্কে আরও তথ্য পাবেন।

(আপনি যদি এটি করেন তবে আপনি সম্ভবত কিছু বিকাশকারী কাঠামো তৈরি করছেন যা অন্য বিকাশকারীরা ব্যবহার করতে পারেন))

অন্যথায়, আপনি যদি প্রতিবিম্ব ব্যবহার না করে থাকেন তবে সিন্থেটিক ক্লাসগুলির ব্যবহারিক ব্যবহার নেই যা আমি জানি।


1
হ্যাঁ, নমুনা কোডটি ভাল হবে যদি আপনি উদাহরণ প্রদান করতে পারেন /
ন্যানোফারাড

36
এটি প্রশ্নের উত্তর দেয় না।
দাউদ ইবনে করিম

স্যুইচ কেসের ক্ষেত্রে, আমি নিশ্চিত নই যে প্রতিটা স্যুইচ-এর ক্ষেত্রে এটি ঘটে কিনা, তবে আমি এনামগুলির সাথে স্যুইচ করার জন্য এটি পর্যবেক্ষণ করেছি; সংকলকটি একক স্থিতিশীল ক্ষেত্র সহ বেনাম শ্রেণি তৈরি করে যা ম্যাপিং Enum.ordinal () -> 1, 2, 3 ... (তাই ফাঁক ছাড়াই একটি ক্রম) সরবরাহ করে এবং তারপরে একটি লুকসুইচ নির্দেশাবলী এই ক্রমটিতে স্যুইচটি চালায়, সরাসরি নয় অর্ডিনালে।
রদিম ভানসা

106

জাভা রানটাইমে ক্লাস তৈরি করার ক্ষমতা রাখে। এই ক্লাসগুলি সিন্থেটিক ক্লাস বা ডায়নামিক প্রক্সি হিসাবে পরিচিত।

আরও তথ্যের জন্য http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html দেখুন ।

অন্যান্য ওপেন সোর্স লাইব্রেরি যেমন সিজিএলআইবি এবং এএসএম আপনাকে সিনথেটিক ক্লাস তৈরি করার অনুমতি দেয় সরবরাহিত লাইব্রেরির চেয়ে আরও শক্তিশালী।

সিন্থেটিক ক্লাসগুলি এওপি (অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং) লাইব্রেরি যেমন স্প্রিং এওপি এবং অ্যাসপেক্টজে, পাশাপাশি হাইবারনেটের মতো ওআরএম লাইব্রেরি দ্বারা ব্যবহৃত হয়।


6
ডায়নামিক প্রক্সিগুলি সিন্থেটিক ক্লাস নয় roপ্রুফ:Proxy.newProxyInstance(Runnable.class.getClassLoader(), new Class[]{Runnable.class}, (proxy, method, args1) -> null).getClass().isSynthetic() == false
মিহ_এক্স Oct৪

3
জাভাদোক java.lang.reflect.Member#isSyntheticবলেছেন: এই সদস্যটি সংকলক দ্বারা প্রবর্তিত হলে সত্য
গিলাইম হুস্তা

আমি বিশ্বাস করি যে জাভাদোক java.lang.reflect.Member#isSyntheticমূল প্রশ্নের সাথে অপ্রাসঙ্গিক। সদস্যরা ক্ষেত্র, নির্মাতা এবং পদ্ধতি। আসল প্রশ্নটি সিন্থেটিক ক্লাস সম্পর্কে ছিল , সিন্থেটিক মেম্বার নয়। জাভা 8-এ, ল্যাম্বডা এক্সপ্রেশনগুলি সিন্থেটিক ক্লাসগুলিকে জন্ম দেয় - আমি নিশ্চিত নই যে তারা কী কী পরিস্থিতিতে উঠতে পারে।
ফ্রে জেরেমি ক্রিগ

54

ভাল আমি গুগলে প্রথম প্রশ্নের উত্তর পেয়েছি:

কোনও শ্রেণি সংকলক হিসাবে চিহ্নিত করা যেতে পারে যদি এটি সংকলক দ্বারা উত্পন্ন হয়, অর্থাত্, এটি উত্স কোডে উপস্থিত হয় না।

এটি কেবলমাত্র একটি প্রাথমিক সংজ্ঞা তবে আমি এটি একটি ফোরামের থ্রেডে পেয়েছি এবং এর কোনও ব্যাখ্যা নেই। এখনও আরও ভাল একটি সন্ধান করছেন ...


15

সিন্থেটিক ক্লাস / পদ্ধতি / ক্ষেত্র:

এই জিনিসগুলি ভিএম এর জন্য গুরুত্বপূর্ণ। নিম্নলিখিত কোড স্নিপেট এক নজরে দেখুন:

class MyOuter {

  private MyInner inner;

  void createInner() {
    // The Compiler has to create a synthetic method
    // to construct a new MyInner because the constructor
    // is private.
    // --> synthetic "constructor" method
    inner = new MyInner();

    // The Compiler has to create a synthetic method
    // to doSomething on MyInner object because this
    // method is private.
    // --> synthetic "doSomething" method
    inner.doSomething();
  }

  private class MyInner {
    // the inner class holds a syntetic ref_pointer to
    // the outer "parent" class
    // --> synthetic field
    private MyInner() {
    }
    private void doSomething() {
    }
  }
}

2
@CiroSantilli 事件 事件 2016 六四 事件 法轮功, না, কেবল সিনথেটিক অ্যাকসেসর পদ্ধতি।
মিহা_এক্স Oct৪

8

এই আলোচনা অনুসারে , যদিও ভাষা স্পেসিফিকেশন ক্লাসগুলির জন্য "ইসসেন্টিথিক" প্রপ্রেটি বর্ণনা করে, বাস্তবায়নের দ্বারা এটি একেবারেই উপেক্ষা করা হয় এবং গতিশীল প্রক্সি বা বেনাম শ্রেণীর জন্য ব্যবহৃত হয় না। সিন্থেটিক ফিল্ডস এবং কনস্ট্রাক্টরগুলি নেস্টেড ক্লাসগুলি বাস্তবায়নের জন্য ব্যবহৃত হয় (কেবল উত্স কোডে বাইট কোডে নেস্টেড ক্লাসগুলির ধারণা নেই)।

আমি মনে করি সিনথেটিক শ্রেণির ধারণাটি কেবল কার্যকরভাবে প্রমাণিত হয়নি, অর্থাত কোনও শ্রেণি সিন্থেটিক কিনা তা কেউই পাত্তা দেয় না। ক্ষেত্র এবং পদ্ধতিগুলির সাহায্যে এটি সম্ভবত এক জায়গায় ব্যবহার করা হয়েছে: কোনও IDE শ্রেণীর কাঠামো দর্শনটিতে কী প্রদর্শিত হবে তা নির্ধারণ করার জন্য - আপনি সেখানে সাধারণ পদ্ধতি এবং ক্ষেত্রগুলি দেখানোর জন্য চান তবে নেস্টেড ক্লাসগুলি সিমুলেট করার জন্য ব্যবহৃত সিন্থেটিকগুলি নয়। OTOH, আপনি বেনামে ক্লাস সেখানে প্রদর্শন করতে চান।


@ ওরেঞ্জডগ: হ্যাঁ, আমি যা লিখেছিলাম
মাইকেল বর্গওয়ার্ট

এই উত্তরটি জাভা 8 সাল থেকে পুরানো বলে মনে হচ্ছে - ল্যাম্বডাস এবং পদ্ধতির উল্লেখগুলি এই বৈশিষ্ট্যটি ব্যবহার করে। আমি এটি প্রকাশ করে একটি উত্তর
হাল্ক

7

এগুলি চালনার সময়ে জেভিএম দ্বারা তৈরি করা হয় যখন তারা ডিবাগিংয়ের উদ্দেশ্যে অভ্যন্তরীণ শ্রেণির ব্যক্তিগত সদস্যদের ডাকে

কার্যকর করার উদ্দেশ্যে রানও সময়কালে জেভিএম দ্বারা তৈরি পদ্ধতি, ক্ষেত্রগুলি, শ্রেণিগুলি সিন্থেটিক বলে

http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html

http://javapapers.com/core-java/java-synthetic-class-method-field/


আমার ধারণা আপনি সংকলনের সময় বলতে চাইছেন, এবং রানটাইম নয় time
মোস্তোস্কি

@ সাথিস, আপনি জাভ্যাক বলতে চাইছেন, জেভিএম নয়?
মিহা_এক্স 64

3

এছাড়াও রানটাইমে ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাসগুলির বাস্তবায়ন তৈরি করতে ইজিমক দ্বারা সিন্থেটিক ক্লাস বা ডায়নামিক প্রক্সিগুলি ব্যবহৃত হয়।

http://www.easymock.org/


2

যখন জাভা সংকলক নির্দিষ্ট নির্মাণগুলি যেমন অভ্যন্তরীণ শ্রেণীর সংকলন করে, তখন এটি সিন্থেটিক কনস্ট্রাক্টস তৈরি করে ; এগুলি হল শ্রেণি, পদ্ধতি, ক্ষেত্র এবং অন্যান্য কনস্ট্রাক্টস যা উত্স কোডে সম্পর্কিত কনস্ট্রাক্ট নেই।
ব্যবহারসমূহ: সিন্থেটিক কনস্ট্রাক্টসগুলি জাভা সংকলকগুলিকে JVM এ পরিবর্তন না করে নতুন জাভা ভাষার বৈশিষ্ট্যগুলি প্রয়োগ করতে সক্ষম করে। তবে, বিভিন্ন জাভা সংকলক প্রয়োগের মধ্যে সিন্থেটিক কনস্ট্রাক্ট বিভিন্ন পরিবর্তিত হতে পারে যার অর্থ .class ফাইলগুলি বিভিন্ন বাস্তবায়নের মধ্যেও পরিবর্তিত হতে পারে।
তথ্যসূত্র: docs.oracle.com


2

যেমন বিভিন্ন উত্তর ইতিমধ্যে চিহ্নিত করেছে, সংকলকটি বিভিন্ন কনস্ট্রাক্ট (ক্লাস সহ) উত্পন্ন করার অনুমতি দেয় যা সোস কোডের কোনও কিছুর সাথে সরাসরি মিল নেই correspond এগুলি সিন্থেটিক হিসাবে চিহ্নিত করতে হবে:

13.1। একটি বাইনারি রূপ

কোনও শ্রেণি বা ইন্টারফেসের জন্য বাইনারি উপস্থাপনে নিম্নলিখিত সমস্তগুলি অবশ্যই উপস্থিত থাকতে পারে:
[...]
১১. জাভা সংকলক দ্বারা নির্গত কোন নির্মাণটি অবশ্যই সংশ্লেষিত হিসাবে চিহ্নিত করতে হবে যদি এটি উত্স কোডে সুস্পষ্টভাবে বা স্পষ্টভাবে ঘোষিত কোনও নির্মাণের সাথে সামঞ্জস্য না হয় 11. , যদি না নির্গত নির্মাণ একটি শ্রেণি সূচনা পদ্ধতি (JVMS §2.9) না হয়।
[...]

অন্য প্রশ্নে একটি মন্তব্যে @ হোলজার দ্বারা চিহ্নিত হিসাবে , এ জাতীয় নির্মাণের জন্য প্রাসঙ্গিক উদাহরণগুলি পদ্ধতি রেফারেন্স এবং ল্যাম্বডাসকে উপস্থাপন করে এমন শ্রেণি অবজেক্টগুলি:

System.out.println(((Runnable) System.out::println).getClass().isSynthetic());
System.out.println(((Runnable) () -> {}).getClass().isSynthetic());

আউটপুট:

true
true

যদিও এটি সুস্পষ্টভাবে উল্লেখ করা হয়নি, এটি 15.27.4 থেকে অনুসরণ করে ল্যাম্বদা এক্সপ্রেশনগুলির রান-টাইম মূল্যায়ন :

ল্যাম্বডা এক্সপ্রেশনটির মান হ'ল নিম্নলিখিত বৈশিষ্ট্যগুলি সহ কোনও শ্রেণীর উদাহরণের জন্য একটি রেফারেন্স: [...]

এবং পদ্ধতি রেফারেন্সগুলির জন্য প্রায় অভিন্ন শব্দ ( 15.13.3। পদ্ধতি রেফারেন্সগুলির রান-টাইম মূল্যায়ন )।

এই শ্রেণিটি উত্স কোডে কোথাও স্পষ্টভাবে উল্লেখ করা হয়নি, তাই এটি সিন্থেটিক হতে হবে।


1

যদি আমি এটি সঠিকভাবে পাই তবে একটি সিন্থেটিক শ্রেণি ফ্লাইতে উত্পন্ন হয়, এটি একটি স্পষ্ট নাম না দিয়ে। উদাহরণ স্বরূপ:

//...
Thread myThread = new Thread() {
         public void run() {
           // do something ...
         }
       };
myThread.start();
//...

এটি থ্রেডের একটি সিন্থেটিক সাবক্লাস তৈরি করে এবং তার রান () পদ্ধতিটি ওভাররাইড করে, তারপরে এটি ইনস্ট্যান্ট করে এটিকে শুরু করে।


3
আমি ভেবেছিলাম এটি একটি বেনামে অভ্যন্তর শ্রেণি
কুমার অভিনব

2
আমাকে @ কুমারআবিনাভের সাথে একমত হতে হবে। সমস্ত বেনামে অভ্যন্তর শ্রেণিগুলি সিন্থেটিক নয়। দেখুন: xinotes.net/notes/note/1339
bvdb

অজ্ঞাতনামা অভ্যন্তরীণ ক্লাসগুলি ওরাকল জেডিকে 1.8.0_45 এ সিনথেটিক ক্লাস তৈরি করে না, তারা টাইপের নাম সহ পৃথক পৃথক অ সিন্থেটিক ক্লাস তৈরি করে Outer$1.class
সিরো সান্তিলি :4 冠状 病 六四 事件 法轮功

1

জাভাতে সিনথেটিক শ্রেণি কী?

একটি syntheticক্লাস জাভা কম্পাইলার.class দ্বারা উত্পাদিত একটি ফাইল এবং এটি উত্স কোডে বিদ্যমান নেই।

syntheticশ্রেণীর ব্যবহারের উদাহরণ : বেনামে অভ্যন্তর শ্রেণি

  • java.text.DigitList $ 1 হ'ল কsynthetic শ্রেণি এবং এটি java.text.DizzList এর ভিতরে একটি বেনামে অভ্যন্তর শ্রেণি
  • এবং এর মতো নামকরণের কোনও উত্স কোড ফাইল নেই DigitList$1.javaতবে এটি একটি অভ্যন্তরীণ ফাইলDigitList.java

কেন এটি ব্যবহার করা উচিত?

এটি .classফাইল তৈরির জন্য জাভা সংকলক যুক্তির ভিতরে একটি প্রক্রিয়া

আমি কীভাবে এটি ব্যবহার করতে পারি?

না, বিকাশকারীরা তা করেন না এটা সরাসরি ব্যবহার করুন।

জাভা সংকলক ফাইল syntheticউত্পন্ন করতে ব্যবহার .classকরুন এবং তারপরে JVM পড়ুন.class প্রোগ্রামটির যুক্তি ফাইলটি ।

আরো বিস্তারিত

  • এই নিবন্ধটি ব্যাখ্যা করেsynthetic বিশদে বিশদ
  • এই লিঙ্কটি সব তালিকাবদ্ধ syntheticমধ্যে বর্গ প্রস্থানের JDK

নিবন্ধটি খুবই দরকারী, আপনাকে ধন্যবাদ
JasonMing

0

সিনথেটিক কনস্ট্রাক্টস হ'ল ক্লাস, পদ্ধতি, ক্ষেত্র ইত্যাদি যা উত্স কোডে সংশ্লিষ্ট কাঠামো নেই। সিন্থেটিক কনস্ট্রাক্টসগুলি জাভা সংকলকগুলিকে জেভিএম পরিবর্তন না করে নতুন জাভা ভাষার বৈশিষ্ট্যগুলি প্রয়োগ করতে সক্ষম করে। যাইহোক, বিভিন্ন জাভা সংকলক প্রয়োগের মধ্যে সিন্থেটিক কনস্ট্রাক্ট বিভিন্ন পরিবর্তিত হতে পারে যার অর্থ .class ফাইলগুলিও বিভিন্ন বাস্তবায়নের মধ্যে পরিবর্তিত হতে পারে।


1
-1। খুব একই পাঠ্যটি, ভারব্যাটিম আপনার [ stackoverflow.com/a/24271953/1144395] এর এক বছর পূর্বে দেওয়া উত্তরে পোস্ট করা হয়েছিল , এবং আরও এখনও সেই উত্তরটি পাঠ্যের উত্স হিসাবে সরকারী রেফারেন্সটি উদ্ধৃত করেছে এবং সহজ পাঠের জন্য বিন্যাস সরবরাহ করেছিল । স্পষ্টত সদৃশ উত্তর সহ লোভজনক স্প্যাম প্রশ্ন করবেন না।
নাকি

0

একটি সিন্থেটিক শ্রেণি আপনার কোডে উপস্থিত হয় না: এটি সংকলক দ্বারা তৈরি করা হয়। যেমন জাভাতে সংকলক দ্বারা তৈরি একটি ব্রিজ পদ্ধতি সাধারণত কৃত্রিম।

public class Pair<T> {
    private T first;
    private T second;
    public void setSecond(T newValue) {
        second = newValue;
    }
}


public class DateInterval extends Pair<String> {
    public void setSecond(String second) {
        System.out.println("OK sub");
    }

    public static void main(String[] args) throws NoSuchFieldException, SecurityException {
        DateInterval interval = new DateInterval();
        Pair pair = interval;
        pair.setSecond("string1");
    }
}

কমান্ডটি ব্যবহার করে javap -verbose DateInterval, আপনি একটি সেতু পদ্ধতি দেখতে পাবেন:

public void setSecond(java.lang.Object);
flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC

এটি সংকলক দ্বারা তৈরি করা হয়েছিল; এটি আপনার কোডে উপস্থিত হয় না।

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