অনুপস্থিত টীকাগুলি কেন রানটাইমে ক্লাসনটফাউন্ডএক্সপিসনের কারণ নয়?


91

নিম্নলিখিত কোড বিবেচনা করুন:

উঃ জাভা:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface A{}

সি জাভা:

import java.util.*;

@A public class C {
        public static void main(String[] args){
                System.out.println(Arrays.toString(C.class.getAnnotations()));
        }
}

প্রত্যাশার মতো কাজগুলি সংকলন এবং চলমান:

$ javac *.java
$ java -cp . C
[@A()]

তবে তারপরে এটি বিবেচনা করুন:

$ rm A.class
$ java -cp . C
[]

অনুপস্থিত ছিলাম ClassNotFoundExceptionযেহেতু @Aএটি একটি নিক্ষিপ্ত হবে since তবে পরিবর্তে, এটি নীরবে টীকাটি বাদ দেয়।

এই আচরণটি কোথাও জেএলএসে নথিভুক্ত করা হয়েছে, না এটি সান এর জেভিএমের এক গৌরব? এর যৌক্তিকতা কী?

এটি javax.annotation.Nonnull(যেমনটি @Retention(CLASS)যাইহোক এটি হওয়া উচিত ছিল বলে মনে হয়) এর মতো সুবিধাজনক বলে মনে হয় তবে অন্যান্য অনেক টিকাশির জন্য মনে হয় এটি রানটাইম সময়ে বিভিন্ন খারাপ জিনিস ঘটায়।

উত্তর:


90

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

এমনকি শব্দটি কিছুটা অস্পষ্ট হলেও, আমি ধরে নিই যে আপনি যে আচরণটি দেখছেন তা জেএলএস 13.5.7 এ নির্দিষ্ট করা হয়েছে: "... টীকাগুলি মুছে ফেলার জন্য জাভা প্রোগ্রামিং ভাষার প্রোগ্রামগুলির বাইনারি উপস্থাপনার সঠিক সংযোগের উপর কোনও প্রভাব নেই has " আমি এটিকে ব্যাখ্যা করি যেন টীকাগুলি মুছে ফেলা হয় (রানটাইম উপলভ্য নয়), প্রোগ্রামটি এখনও লিঙ্ক করে চালানো উচিত এবং এর দ্বারা বোঝা যায় যে প্রতিবিম্বের মাধ্যমে অ্যাক্সেস পাওয়া গেলে অজানা টীকাগুলি কেবল উপেক্ষা করা হয়।

সানের জেডিকে 5-এর প্রথম প্রকাশটি এটি সঠিকভাবে প্রয়োগ করে না, তবে এটি 1.5.0.06 এ স্থির করা হয়েছিল। আপনি বাগের ডাটাবেসে প্রাসঙ্গিক বাগ 6322301 সন্ধান করতে পারেন , তবে এটি "জেএসআর-175 স্পষ্ট লিড অনুসারে, অজানা টীকাগুলি getAnnotations দ্বারা উপেক্ষা করা উচিত" দাবি করা ব্যতীত কোনও নির্দিষ্টকরণের দিকে ইঙ্গিত করে না।


35

জেএলএসের উদ্ধৃতি:

9.6.1.2 ধরে রাখার টীকাগুলি কেবল উত্স কোডে উপস্থিত থাকতে পারে বা তারা কোনও বর্গ বা ইন্টারফেসের বাইনারি আকারে উপস্থিত থাকতে পারে। বাইনারি উপস্থিত একটি টিকা জাভা প্ল্যাটফর্মের প্রতিফলিত গ্রন্থাগারগুলির মাধ্যমে রান-টাইমে উপলভ্য বা নাও থাকতে পারে।

উপরের সম্ভাব্যতার মধ্যে চয়ন করতে এনটোটেশন ধরণের টিকা। প্রতিস্থাপন ব্যবহৃত হয়। যদি একটি টীকা টি টাইপ টির সাথে মিলে যায় এবং টিতে একটি (মেটা-) টিকা এম থাকে যা টীকাটির সাথে মিলে যায় e

  • মিটার যদি এমন একটি উপাদান থাকে যার মানটি টীকা দেওয়া হয় e
  • যদি মি এর এমন কোনও উপাদান থাকে যার মানটি টীকা দেওয়া হয় eর্টেনশনপলিসি LA ক্লাস, বা টিকাকরণ e অনুগ্রহপূর্বক পলিসি UNT রন্টটাইম একটি জাভা সংকলক অবশ্যই নিশ্চিত করতে হবে যে বর্গ বা ইন্টারফেসের বাইনারি উপস্থাপনায় একটি উপস্থিত রয়েছে যেখানে একটি স্থানীয় পরিবর্তনশীল ঘোষণার উল্লেখ না করে । স্থানীয় পরিবর্তনশীল ঘোষণার উপর কোনও টীকাগুলি বাইনারি উপস্থাপনায় কখনই ধরে রাখা হয় না।

টি-তে যদি কোনও (মেটা-) টীকাগুলি না থাকে যা টীকাগুলির সাথে মিলে যায় eeetentiontention,,,, compiler।।।। Treat।।।। It element।।। Ann।।।।।।।।।।।।। A a।। A a Java।। A Java

সুতরাং রিটেনশনপলিসি.আর্টিন্টটাইম নিশ্চিত করে যে টিকাটি বাইনারিটিতে সংকলিত হয়েছে তবে বাইনারিটিতে উপস্থিত একটি টীকাগুলি রানটাইমের সময় উপলব্ধ থাকতে হবে না


9

আপনার যদি আসলে কোড আছে যা @ এ পড়ছে এবং এটি দিয়ে কিছু করে, কোডটি ক্লাস এ এর ​​উপর নির্ভরশীলতা রয়েছে এবং এটি ClassNotFoundException নিক্ষেপ করবে।

যদি না হয়, তবে কোনও কোডই @A সম্পর্কে সুনির্দিষ্টভাবে চিন্তা করে না, তবে এটি বিতর্কযোগ্য যে @ এ আসলেই কোনও বিষয় নয়।

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