জাভা বাইট কোডটি নিয়ে বেশ কিছুক্ষণ কাজ করার পরে এবং এই বিষয়ে কিছু অতিরিক্ত গবেষণা করার পরে, এখানে আমার অনুসন্ধানের সংক্ষিপ্তসার তুলে ধরছি:
সুপার কনস্ট্রাক্টর বা সহায়ক কন্সট্রাক্টরকে কল করার আগে কোনও কনস্ট্রাক্টরে কোড কার্যকর করুন
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে (জেপিএল), কোনও কনস্ট্রাক্টরের প্রথম বিবৃতি অবশ্যই একটি সুপার কনস্ট্রাক্টর বা একই বর্গের অন্য কোনও কনস্ট্রাক্টরের অনুরোধ হতে হবে। এটি জাভা বাইট কোড (জেবিসি) এর ক্ষেত্রে সত্য নয়। বাইট কোডের মধ্যে, কোনও কনস্ট্রাক্টরের আগে কোনও কোড কার্যকর করা একেবারেই বৈধ, যতক্ষণ না:
- এই কোড ব্লকের পরে আরও একটি সামঞ্জস্যপূর্ণ কনস্ট্রাক্টর কল করা হয়।
- এই কলটি শর্তাধীন বিবৃতিতে নয়।
- এই কনস্ট্রাক্টর কল করার আগে, নির্মিত ইনস্ট্যান্টের কোনও ক্ষেত্রটি পড়া হয় না এবং এর কোনও পদ্ধতির অনুরোধ করা হয় না। এটি পরবর্তী আইটেমটি বোঝায়।
সুপার কনস্ট্রাক্টর বা সহায়ক কন্সট্রাক্টরকে কল করার আগে উদাহরণ ক্ষেত্রগুলি সেট করুন
পূর্বে উল্লিখিত হিসাবে, অন্য কোনও কনস্ট্রাক্টরকে কল করার আগে উদাহরণের ক্ষেত্রের মান নির্ধারণ করা পুরোপুরি আইনী। এমনকি একটি লিগ্যাসি হ্যাক উপস্থিত রয়েছে যা এটি 6 এর আগে জাভা সংস্করণগুলিতে এই "বৈশিষ্ট্য "টি কাজে লাগাতে সক্ষম করে:
class Foo {
public String s;
public Foo() {
System.out.println(s);
}
}
class Bar extends Foo {
public Bar() {
this(s = "Hello World!");
}
private Bar(String helper) {
super();
}
}
এইভাবে, সুপার কন্সট্রাক্টর চালিত হওয়ার আগে একটি ক্ষেত্র সেট করা যেতে পারে যা সম্ভবত আর সম্ভব নয়। জেবিসি-তে, এই আচরণটি এখনও প্রয়োগ করা যেতে পারে।
একটি সুপার কনস্ট্রাক্টর কল শাখা
জাভাতে, কনস্ট্রাক্টর কলের মতো সংজ্ঞা দেওয়া সম্ভব নয়
class Foo {
Foo() { }
Foo(Void v) { }
}
class Bar() {
if(System.currentTimeMillis() % 2 == 0) {
super();
} else {
super(null);
}
}
জাভা 7u23 অবধি, হটস্পট ভিএম এর যাচাইকারী অবশ্য এই চেকটি মিস করে নি যার কারণেই এটি সম্ভব হয়েছিল। এটি বেশ কয়েকটি কোড জেনারেশন সরঞ্জাম দ্বারা হ্যাকের বাছাই হিসাবে ব্যবহার করা হয়েছিল তবে এটির মতো শ্রেণি প্রয়োগ করা এখন আর আইনী নয়।
দ্বিতীয়টি এই সংকলক সংস্করণে কেবল একটি বাগ ছিল। আরও নতুন সংকলক সংস্করণে, এটি আবার সম্ভব।
কোনও নির্মাতা ছাড়াই একটি ক্লাস সংজ্ঞায়িত করুন
জাভা সংকলক সর্বদা যে কোনও শ্রেণীর জন্য কমপক্ষে একজন নির্মাতা বাস্তবায়ন করবে implement জাভা বাইট কোডে, এটি প্রয়োজন হয় না। এটি এমন শ্রেণীর তৈরি করতে দেয় যা প্রতিবিম্ব ব্যবহার করার পরেও নির্মাণ করা যায় না। তবে, sun.misc.Unsafe
এখনও ব্যবহারের ফলে এ জাতীয় দৃষ্টান্ত তৈরি করা যায়।
অভিন্ন স্বাক্ষর সহ তবে ভিন্ন রিটার্নের ধরণের সাথে পদ্ধতিগুলি সংজ্ঞায়িত করুন
জেপিএলে, কোনও পদ্ধতি তার নাম এবং এর কাঁচা প্যারামিটার ধরণের দ্বারা অনন্য হিসাবে চিহ্নিত করা হয়। জেবিসি-তে, কাঁচা ফেরতের প্রকারটি অতিরিক্তভাবে বিবেচনা করা হয়।
নামগুলি দ্বারা পৃথক নয় কেবল ক্ষেত্রগুলি নির্দিষ্ট করুন
কোনও শ্রেণি ফাইলটিতে একই নামের বেশ কয়েকটি ক্ষেত্র থাকতে পারে যতক্ষণ না তারা ভিন্ন ক্ষেত্রের প্রকার ঘোষণা করে। জেভিএম সর্বদা একটি ক্ষেত্রকে নাম এবং প্রকারের টিপল হিসাবে উল্লেখ করে।
অঘোষিত চেক করা ব্যতিক্রমগুলি তাদের না ধরে ফেলে দিন
জাভা রানটাইম এবং জাভা বাইট কোড চেক করা ব্যতিক্রমগুলির ধারণা সম্পর্কে অবগত নয়। এটি কেবল জাভা সংকলকই যাচাই করেছে যে চেক করা ব্যতিক্রমগুলি সর্বদা হয় ছুঁড়ে দেওয়া হয় বা যদি তারা নিক্ষিপ্ত হয় তবে তা ঘোষণা করা হয়।
ল্যাম্বডা এক্সপ্রেশনগুলির বাইরে ডায়নামিক পদ্ধতি অনুরোধ ব্যবহার করুন
তথাকথিত গতিশীল পদ্ধতির প্রার্থনা কেবল জাভার ল্যাম্বডা এক্সপ্রেশনগুলির জন্য নয়, যে কোনও কিছুর জন্য ব্যবহার করা যেতে পারে। এই বৈশিষ্ট্যটি ব্যবহার করা উদাহরণস্বরূপ রানটাইমে এক্সিকিউশন লজিকটিকে স্যুইচ আউট করার অনুমতি দেয়। অনেকগুলি গতিশীল প্রোগ্রামিং ল্যাঙ্গুয়েজ যা জেবিসি-তে ডুবে গেছে এই নির্দেশিকাটি ব্যবহার করে তাদের কার্যকারিতা উন্নত করেছে । জাভা বাইট কোডে, আপনি জাভা in-তে ল্যাম্বডা এক্সপ্রেশনগুলি অনুকরণ করতে পারেন যেখানে জেভিএম ইতিমধ্যে নির্দেশটি বুঝতে পেরে কম্পাইলার এখনও গতিশীল পদ্ধতির অনুরোধের কোনও অনুমতি দেয়নি।
সনাক্তকারীদের ব্যবহার করুন যা সাধারণত আইনী হিসাবে বিবেচিত হয় না
কখনও আপনার পদ্ধতির নামে ফাঁকা স্থান এবং একটি লাইন ব্রেক ব্যবহার করে ফ্যানসিড করেছেন? আপনার নিজের জেবিসি এবং কোড পর্যালোচনার জন্য শুভকামনা তৈরি করুন। শনাক্তকারী কেবল অবৈধ অক্ষর .
, ;
, [
এবং /
। অতিরিক্তভাবে, নাম নেই <init>
বা <clinit>
না থাকতে পারে এমন পদ্ধতিতে <
এবং >
।
final
পরামিতি বা this
রেফারেন্স পুনরায় সাইন করুন
final
প্যারামিটারগুলি জেবিসি-তে বিদ্যমান নেই এবং ফলস্বরূপ পুনরায় নিয়োগ দেওয়া যেতে পারে। this
রেফারেন্স সহ যে কোনও প্যারামিটার কেবল JVM এর মধ্যে একটি সাধারণ অ্যারেতে সংরক্ষণ করা হয় যা কোনও একক পদ্ধতি ফ্রেমের মধ্যে this
সূচীতে রেফারেন্সটিকে পুনরায় নিয়োগ করতে দেয় 0
।
final
ক্ষেত্রগুলি পুনরায় বরাদ্দ করুন
যতক্ষণ না কোনও নির্মাণকারীর মধ্যে একটি চূড়ান্ত ক্ষেত্র নির্ধারিত হয়, এই মানটিকে পুনরায় নিয়োগ করা এমনকি কোনও মান নির্ধারণ না করাও আইনী is অতএব, নিম্নলিখিত দুটি নির্মাণকারী বৈধ:
class Foo {
final int bar;
Foo() { } // bar == 0
Foo(Void v) { // bar == 2
bar = 1;
bar = 2;
}
}
জন্য static final
ক্ষেত্র, এমনকি এটি বর্গ সূচনাকারী বাইরে ক্ষেত্র reassign অনুমোদিত হয়।
কনস্ট্রাক্টর এবং ক্লাস ইনিশিয়ালাইজারকে ট্রিট করুন যেন তারা পদ্ধতি
এটি একটি ধারণাগত বৈশিষ্ট্য বেশি তবে নির্মাতারা সাধারণ পদ্ধতির চেয়ে জেবিসি-র মধ্যে কোনও আলাদা আচরণ করা হয় না। এটি কেবল জেভিএমের যাচাইকারীই আশ্বাস দেয় যে নির্মাতারা অন্য আইনী কনস্ট্রাক্টরকে কল করে call তা ছাড়া, এটি কেবল জাভা নামকরণের কনভেনশন যা নির্মাণকারীদের ডেকে আনা <init>
এবং ক্লাস ইনিশিয়ালাইজার বলা হয় <clinit>
। এই পার্থক্য ছাড়াও, পদ্ধতি এবং নির্মাতাদের প্রতিনিধিত্ব অভিন্ন। হোলগার যেমন একটি মন্তব্যে নির্দেশ করেছেন, আপনি এমনকি void
এই পদ্ধতিগুলি কল করা সম্ভব না হলেও, আপনি যুক্তি ব্যতীত অন্য কোনও রিটার্ন টাইপের সাথে নির্মাণকারী বা ক্লাস ইনিশিয়ালাইজারকে সংজ্ঞায়িত করতে পারেন ।
অসমমিতিক রেকর্ড তৈরি করুন * ।
একটি রেকর্ড তৈরি করার সময়
record Foo(Object bar) { }
জাভাক একটি একক ক্ষেত্রের নামের সাথে একটি ক্লাস ফাইল তৈরি করবে bar
, নামক একটি অ্যাসেসর পদ্ধতি bar()
এবং একটি একক গ্রহণকারী একটি নির্মাণকারী Object
। অতিরিক্তভাবে, এর জন্য একটি রেকর্ড বৈশিষ্ট্য bar
যুক্ত করা হয়। ম্যানুয়ালি একটি রেকর্ড উত্পন্ন করার মাধ্যমে, ক্ষেত্রটি এড়ানো এবং অ্যাক্সেসরটিকে আলাদাভাবে প্রয়োগ করা সম্ভব, একটি ভিন্ন নির্মাতা আকার তৈরি করা সম্ভব। একই সময়ে, এখনও প্রতিবিম্বের এপিআই বিশ্বাস করা সম্ভব যে শ্রেণিটি একটি আসল রেকর্ড উপস্থাপন করে।
যে কোনও সুপার পদ্ধতিতে কল করুন (জাভা ১.১ অবধি)
তবে এটি কেবল জাভা সংস্করণ 1 এবং 1.1 এর ক্ষেত্রেই সম্ভব। জেবিসি-তে, পদ্ধতিগুলি সর্বদা সুস্পষ্ট লক্ষ্য ধরণের প্রেরণ করা হয়। এর অর্থ এটি for
class Foo {
void baz() { System.out.println("Foo"); }
}
class Bar extends Foo {
@Override
void baz() { System.out.println("Bar"); }
}
class Qux extends Bar {
@Override
void baz() { System.out.println("Qux"); }
}
তা বাস্তবায়ন করা সম্ভব ছিল Qux#baz
ডাকা Foo#baz
যখন উপর জাম্পিং Bar#baz
। সরাসরি সুপার ক্লাসের চেয়ে আরও একটি সুপার পদ্ধতি বাস্তবায়ন কল করার জন্য একটি স্পষ্ট আহবানকে এখনও সংজ্ঞায়িত করা সম্ভব হলেও এর ফলে জাভা সংস্করণগুলিতে ১.১ এর পরে আর কোনও প্রভাব পড়বে না। জাভা ১.১-এ, ACC_SUPER
পতাকাটি সেট করে এই আচরণটি নিয়ন্ত্রণ করা হয়েছিল যা একই আচরণকে সক্ষম করবে যা কেবল প্রত্যক্ষ সুপার শ্রেণীর প্রয়োগকে কল করে।
একই শ্রেণিতে ঘোষিত একটি পদ্ধতির একটি অ-ভার্চুয়াল কল সংজ্ঞা দিন
জাভাতে, কোনও শ্রেণির সংজ্ঞা দেওয়া সম্ভব নয় is
class Foo {
void foo() {
bar();
}
void bar() { }
}
class Bar extends Foo {
@Override void bar() {
throw new RuntimeException();
}
}
উপরের কোডটি সর্বদা এর ফলাফল হিসাবে প্রদর্শিত হবে RuntimeException
যখন এর foo
উদাহরণটিতে অনুরোধ জানানো হয় Bar
। এর নিজস্ব পদ্ধতিটি যা সংজ্ঞায়িত হয়েছে Foo::foo
তা আহবান করার জন্য পদ্ধতিটি নির্ধারণ করা সম্ভব নয় । হিসাবে একটি অ-ব্যক্তিগত উদাহরণস্বরূপ পদ্ধতি, কল সবসময় ভার্চুয়াল হয়। বাইট কোড দিয়ে, এক তবে ব্যবহার করতে আবাহন বর্ণনা করতে পারেন opcode যা সরাসরি সংযোগ পদ্ধতি কল করার 'র সংস্করণ। এই অপকোডটি সাধারণত সুপার পদ্ধতি আমন্ত্রণগুলি বাস্তবায়নের জন্য ব্যবহৃত হয় তবে বর্ণিত আচরণটি প্রয়োগ করতে আপনি অপকডটি পুনরায় ব্যবহার করতে পারেন। bar
Foo
bar
INVOKESPECIAL
bar
Foo::foo
Foo
সূক্ষ্ম শস্য ধরণের টিকা
জাভাতে, টীকাগুলি ঘোষণাপত্র অনুসারে টীকাগুলি প্রয়োগ করা হয় @Target
। বাইট কোড ম্যানিপুলেশন ব্যবহার করে, এই নিয়ন্ত্রণ থেকে স্বতন্ত্রভাবে টীকাগুলি সংজ্ঞায়িত করা সম্ভব। এছাড়াও, উদাহরণস্বরূপ প্যারামিটারটি উল্লেখ না করে প্যারামিটারের প্রকারটি টিকিয়ে দেওয়া সম্ভব হয় এমনকি যদি @Target
টীকা উভয় উপাদানের ক্ষেত্রে প্রযোজ্য।
কোনও প্রকার বা এর সদস্যদের জন্য কোনও বৈশিষ্ট্য নির্ধারণ করুন
জাভা ভাষার মধ্যে কেবল ক্ষেত্র, পদ্ধতি বা ক্লাসের জন্য টীকা সংজ্ঞা দেওয়া সম্ভব। জেবিসি তে, আপনি মূলত জাভা ক্লাসে কোনও তথ্য এম্বেড করতে পারেন। এই তথ্যটি ব্যবহার করার জন্য, আপনি আর জাভা বর্গ লোডিং পদ্ধতির উপর নির্ভর করতে পারবেন না তবে আপনাকে নিজের দ্বারা মেটা তথ্য বের করতে হবে।
ওভারফ্লো এবং পরোক্ষভাবে বরাদ্দ byte
, short
, char
এবং boolean
মান
পরবর্তী আদিম ধরণেরগুলি সাধারণত জেবিসি তে পরিচিত হয় না তবে কেবল অ্যারে প্রকারের জন্য বা ক্ষেত্র এবং পদ্ধতি বর্ণনাকারীদের জন্য সংজ্ঞায়িত হয়। বাইট কোডের নির্দেশাবলীর মধ্যে, নামযুক্ত সমস্ত ধরণের স্থান 32 বিট নেয় যা তাদের হিসাবে প্রতিনিধিত্ব করতে দেয় int
। সরকারিভাবে মাত্র int
, float
, long
এবং double
ধরনের বাইট কোড মধ্যে উপস্থিত থাকার যা সব প্রয়োজন জেভিএম এর যাচাইকারী শাসন দ্বারা স্পষ্ট রূপান্তর।
একটি মনিটর মুক্তি না
একটি synchronized
ব্লক আসলে দুটি বিবৃতি নিয়ে গঠিত, একটি অর্জন এবং একটি মনিটর প্রকাশ করার জন্য। জেবিসি-তে, আপনি এটি প্রকাশ না করে একটি অর্জন করতে পারেন।
দ্রষ্টব্য : হটস্পটের সাম্প্রতিক বাস্তবায়নে, এটি পরিবর্তে IllegalMonitorStateException
কোনও পদ্ধতির শেষে বা কোনও পদ্ধতি ব্যতিক্রম দ্বারা পদ্ধতিটি সমাপ্ত হলে নিখুঁত মুক্তির দিকে নিয়ে যায়।
return
টাইপ ইনিশিয়ালাইজারে একাধিক স্টেটমেন্ট যুক্ত করুন
জাভাতে, এমনকি একটি তুচ্ছ ধরনের প্রারম্ভিক
class Foo {
static {
return;
}
}
অবৈধ। বাইট কোডে, টাইপ ইনিশিয়ালাইজারকে অন্য যে কোনও পদ্ধতি হিসাবে ধরা হয়, অর্থাত্ রিটার্নের স্টেটমেন্টগুলি যে কোনও জায়গায় সংজ্ঞায়িত করা যায়।
অপরিবর্তনীয় লুপগুলি তৈরি করুন
জাভা সংকলক জাভা বাইট কোডের লোটগুলিকে গোটো বিবৃতিতে রূপান্তর করে। এই জাতীয় বিবৃতি অপরিবর্তনীয় লুপগুলি তৈরি করতে ব্যবহার করা যেতে পারে যা জাভা সংকলক কখনই করে না।
একটি পুনরাবৃত্তাকারী ব্লক সংজ্ঞা দিন
জাভা বাইট কোডে, আপনি একটি ব্লক সংজ্ঞায়িত করতে পারেন:
try {
throw new Exception();
} catch (Exception e) {
<goto on exception>
throw Exception();
}
synchronized
জাভাতে কোনও ব্লক ব্যবহার করার সময় অনুরূপ বিবৃতি স্পষ্টভাবে তৈরি করা হয় যেখানে কোনও মনিটর ছাড়ার সময় কোনও ব্যতিক্রম এই মনিটরটি প্রকাশের নির্দেশে ফিরে আসে। সাধারণত, এই জাতীয় নির্দেশের ক্ষেত্রে কোনও ব্যতিক্রম ঘটানো উচিত নয় তবে যদি এটি (যেমন অবনমিত ThreadDeath
) হয় তবে মনিটরটি এখনও মুক্তি পাবে।
যে কোনও ডিফল্ট পদ্ধতিতে কল করুন
জাভা সংকলকটির ডিফল্ট পদ্ধতির প্রার্থনা মঞ্জুর করার জন্য বেশ কয়েকটি শর্ত পূরণ করতে হবে:
- পদ্ধতিটি অবশ্যই সুনির্দিষ্ট একটি হতে হবে ( কোনও সুপার ইন্টারফেস সহ যে কোনও ধরণের দ্বারা প্রয়োগ করা হয় এমন একটি উপ ইন্টারফেসের মাধ্যমে ওভাররাইড করা উচিত নয় )।
- ডিফল্ট পদ্ধতির ইন্টারফেস প্রকারটি অবশ্যই ক্লাসের মাধ্যমে সরাসরি প্রয়োগ করা উচিত যা ডিফল্ট পদ্ধতিটি কল করে। তবে, যদি ইন্টারফেসটি ইন্টারফেস
B
প্রসারিত A
করে তবে কোনও পদ্ধতিতে ওভাররাইড না করে A
, তবুও পদ্ধতিটি চালু করা যেতে পারে।
জাভা বাইট কোডের জন্য, কেবলমাত্র দ্বিতীয় শর্ত গণনা করা হয়। প্রথমটি যদিও অপ্রাসঙ্গিক।
এমন উদাহরণে একটি সুপার পদ্ধতি চাওয়া this
জাভা সংকলক কেবল উদাহরণের ভিত্তিতে একটি সুপার (বা ইন্টারফেস ডিফল্ট) পদ্ধতি চালু করতে অনুমতি দেয় this
। বাইট কোডে, তবে নীচের মতো একই ধরণের উদাহরণে সুপার পদ্ধতিটি আহ্বান করাও সম্ভব:
class Foo {
void m(Foo f) {
f.super.toString(); // calls Object::toString
}
public String toString() {
return "foo";
}
}
সিন্থেটিক সদস্যদের অ্যাক্সেস করুন
জাভা বাইট কোডে, সরাসরি সিন্থেটিক সদস্যদের অ্যাক্সেস করা সম্ভব। উদাহরণস্বরূপ, নীচের উদাহরণে অন্য Bar
উদাহরণের বাইরের উদাহরণটি কীভাবে অ্যাক্সেস করা হয় তা বিবেচনা করুন:
class Foo {
class Bar {
void bar(Bar bar) {
Foo foo = bar.Foo.this;
}
}
}
এটি কোনও সিন্থেটিক ক্ষেত্র, শ্রেণি বা পদ্ধতির ক্ষেত্রে সাধারণত সত্য।
সিঙ্কের বাইরে সিঙ্কের জেনেরিক ধরণের তথ্য সংজ্ঞায়িত করুন
যদিও জাভা রানটাইম জেনেরিক ধরণের প্রক্রিয়া করে না (জাভা সংকলক প্রকার মুছে ফেলার পরে), এই তথ্যটি এখনও একটি সংকলিত শ্রেণিতে মেটা তথ্য হিসাবে সংযুক্ত করা হয় এবং প্রতিবিম্ব এপিআইয়ের মাধ্যমে অ্যাক্সেসযোগ্য করে তোলে।
যাচাইকারী এই মেটা ডেটা- String
এনকোডড মানগুলির সামঞ্জস্যতা পরীক্ষা করে না । সুতরাং মুছে ফেলার সাথে মেলে না এমন জেনেরিক ধরণের তথ্য সংজ্ঞায়িত করা সম্ভব। ফলস্বরূপ, নিম্নলিখিত দাবিগুলি সত্য হতে পারে:
Method method = ...
assertTrue(method.getParameterTypes() != method.getGenericParameterTypes());
Field field = ...
assertTrue(field.getFieldType() == String.class);
assertTrue(field.getGenericFieldType() == Integer.class);
এছাড়াও, স্বাক্ষরটিকে অবৈধ হিসাবে সংজ্ঞায়িত করা যেতে পারে যে কোনও রানটাইম ব্যতিক্রম নিক্ষেপ করা হয়। অলসভাবে মূল্যায়ন করা হয় বলে তথ্য প্রথমবার অ্যাক্সেস করা হয় যখন এই ব্যতিক্রম নিক্ষেপ করা হয়। (একটি ত্রুটিযুক্ত টীকা সহ মানসমূহের অনুরূপ।)
প্যারামিটার মেটা তথ্য কেবলমাত্র কয়েকটি নির্দিষ্ট পদ্ধতির জন্য যুক্ত করুন
জাভা সংকলক parameter
পতাকা সক্ষমিত সহ কোনও শ্রেণি সংকলন করার সময় প্যারামিটারের নাম এবং সংশোধক তথ্য এম্বেড করার অনুমতি দেয় । জাভা শ্রেণীর ফাইল ফর্ম্যাটে, এই তথ্যটি প্রতি-পদ্ধতিতে সঞ্চিত থাকে যা নির্দিষ্ট পদ্ধতির জন্য কেবল এই জাতীয় পদ্ধতি এম্বেড করা সম্ভব করে।
আপনার জেভিএমকে জঘন্য জিনিসগুলি আপ করুন এবং হার্ড-ক্র্যাশ করুন
উদাহরণস্বরূপ, জাভা বাইট কোডে, আপনি যে কোনও পদ্ধতিতে যে কোনও পদ্ধতিতে আবেদন করতে সংজ্ঞা দিতে পারেন। সাধারণত, যাচাইকারী অভিযোগ করবেন যদি কোনও ধরণের এই জাতীয় পদ্ধতির কথা না জানা থাকে। তবে আপনি যদি অ্যারেতে কোনও অজানা পদ্ধতিটি চালু করেন তবে আমি কিছু জেভিএম সংস্করণে একটি বাগ পেয়েছি যেখানে যাচাইকারী এটি মিস করবে এবং নির্দেশটি শুরু হওয়ার পরে আপনার জেভিএম সমাপ্ত হবে। এটি যদিও খুব কমই কোনও বৈশিষ্ট্য, তবে এটি প্রযুক্তিগতভাবে জাভাক সংকলিত জাভা দ্বারা সম্ভব নয় । জাভা কিছু ধরণের ডাবল বৈধতা আছে। প্রথম বৈধতা জাভা সংকলক দ্বারা প্রয়োগ করা হয়, দ্বিতীয়টি JVM দ্বারা যখন কোনও শ্রেণি লোড হয়। সংকলকটি এড়িয়ে গিয়ে আপনি যাচাইকারীর বৈধতার মধ্যে একটি দুর্বল জায়গা খুঁজে পেতে পারেন। যদিও এটি কোনও বৈশিষ্ট্যের চেয়ে সাধারণ বিবৃতি।
যখন বাইরের শ্রেণি নেই তখন কোনও কনস্ট্রাক্টরের রিসিভার প্রকারটি টিকান
জাভা 8 হ'ল, অ স্থিতিশীল পদ্ধতি এবং অভ্যন্তরীণ শ্রেণীর নির্মাতারা কোনও রিসিভার প্রকার ঘোষণা করতে এবং এই জাতীয় প্রকারগুলি টিকা দিতে পারে। শীর্ষ-স্তরের শ্রেণির নির্মাতারা তাদের প্রাপক প্রকারটি বেনিফিট করতে পারে না কারণ তারা বেশিরভাগই কোনও ঘোষণা করে না।
class Foo {
class Bar {
Bar(@TypeAnnotation Foo Foo.this) { }
}
Foo() { } // Must not declare a receiver type
}
যেহেতু Foo.class.getDeclaredConstructor().getAnnotatedReceiverType()
কোনও AnnotatedType
প্রতিনিধিত্ব করে ফেরত দেয় Foo
, Foo
তাই ক্লাস ফাইলে যেখানে এই টীকাগুলি পরে প্রতিবিম্ব এপিআই দ্বারা পড়া হয় সেখানে সরাসরি নির্মাতার জন্য টাইপ টীকাগুলি অন্তর্ভুক্ত করা সম্ভব ।
অব্যবহৃত / উত্তরাধিকার বাইট কোড নির্দেশাবলী ব্যবহার করুন
যেহেতু অন্যরা এর নাম দিয়েছে, আমি এটিও অন্তর্ভুক্ত করব। জাভা পূর্বে বক্তব্য JSR
এবং RET
বিবৃতি দ্বারা সাবরুটাইন ব্যবহার করছিল । জেবিসি এমনকি এই উদ্দেশ্যে একটি নিজস্ব রিটার্ন ঠিকানা জানত knew তবে সাব্রোটাইনগুলির ব্যবহার স্থিতিশীল কোড বিশ্লেষণকে অতিরঞ্জিত করেছিল যার কারণে এই নির্দেশাবলী আর ব্যবহার করা হয় না। পরিবর্তে, জাভা সংকলকটি এটি সংকলিত কোডটির নকল করবে। তবে এটি মূলত অভিন্ন যুক্তি তৈরি করে যার কারণে আমি অন্য কিছু অর্জনের জন্য এটি সত্যই বিবেচনা করি না। একইভাবে, আপনি উদাহরণস্বরূপ যোগ করতে পারেNOOP
বাইট কোড নির্দেশ যা জাভা সংকলক দ্বারা ব্যবহৃত হয় না তবে এটি আপনাকে নতুনভাবে কিছু অর্জন করতে দেয় না। প্রসঙ্গে উল্লেখ করা হয়েছে, এই উল্লিখিত "বৈশিষ্ট্য নির্দেশাবলী" এখন আইনী অপকোডগুলির সেট থেকে সরানো হয়েছে যা তাদের কোনও বৈশিষ্ট্য এমনকি কম সরবরাহ করে।