বিভিন্ন টিকিয়ে রাখার নীতিগুলি কীভাবে আমার টীকাগুলিকে প্রভাবিত করে?


175

যে কেউ মধ্যে ব্যবহারিক পার্থক্য সুস্পষ্ট ভাবে ব্যাখ্যা করতে পারবেন java.lang.annotation.RetentionPolicyধ্রুবক SOURCE, CLASSএবং RUNTIME?

"রক্ষণাবেক্ষণ টীকা" এর অর্থ কী তা আমিও ঠিক নিশ্চিত নই।


5
ডকুমেন্টেশন ( java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/… ) খুব স্পষ্ট।
সত্য নরম

হ্যাঁ আমি ইতিমধ্যে পড়েছি তবে অনুশীলনে বুঝতে পারি না এটি কীভাবে কাজ করে। প্রকৃতপক্ষে যদি আমি এই শব্দগুচ্ছটি চেষ্টা করি: "" "" টীকাগুলি সংকলক দ্বারা ক্লাস ফাইলে রেকর্ড করতে হবে তবে রান সময়ে ভিএম দ্বারা রক্ষণ করার প্রয়োজন নেই। "" "এবং তারপরে একটি পচা ক্লাস খুলুন যেখানে আমি ধরে রাখার নীতি CLASS দিয়ে একটি টীকা রেখেছি কিছুই খুঁজে পাই না ...
xdevel2000

2
তারপরে আপনার ডিসকম্পেলারটি টীকাগুলিকে সমর্থন করে না বলে মনে হচ্ছে। জেডি-গুই ভাল কাজ করে।
musiKk

ধন্যবাদ সমস্যাটি ছিল আমার ডিসকম্পিলার ডিজে এবং জাদ ... জেডি-গুই আমাকে দেখান !!
xdevel2000

উত্তর:


210
  • RetentionPolicy.SOURCE: সংকলনের সময় বাতিল করুন। এই টীকাগুলি সংকলনটি শেষ হওয়ার পরে কোনও অর্থবোধ করে না, তাই এগুলি বাইটকোডে লিখিত হয় না।
    উদাহরণ: @Override,@SuppressWarnings

  • RetentionPolicy.CLASS: ক্লাস লোড চলাকালীন বাতিল করুন। বাইকোড-স্তরের পোস্ট-প্রসেসিং করার সময় দরকারী। কিছুটা আশ্চর্যজনকভাবে, এটি ডিফল্ট।

  • RetentionPolicy.RUNTIME: বাতিল করবেন না. টীকাগুলি রানটাইমে প্রতিবিম্বের জন্য উপলব্ধ হওয়া উচিত। উদাহরণ:@Deprecated

উত্স: পুরানো ইউআরএল এখন শিকারী_মেটা মারা গেছে এবং শিকারী-মেটা -2-098036 দ্বারা প্রতিস্থাপিত হয়েছে । এমনকি যদি এটি হ্রাস পায় তবে আমি পৃষ্ঠার চিত্রটি আপলোড করছি।

চিত্র (ডান ক্লিক করুন এবং 'নতুন ট্যাব / উইন্ডোতে চিত্র খুলুন' নির্বাচন করুন) ওরাকল ওয়েবসাইটের স্ক্রিনশট


1
উক্তিটির জন্য ধন্যবাদ, এখানে সবচেয়ে আকর্ষণীয় হ'ল ব্যবহারের ক্ষেত্রেRetentionPolicy.CLASS
সর্বোচ্চ

2
আপনি কী ব্যাখ্যা করতে পারেন কেন রিটেনশনপলিসি.ক্লাস আকর্ষণীয় / আশ্চর্যজনকভাবে ডিফল্ট?
সুডোকোডার

1
: - @sudocoder এই লিঙ্ক পড়ুন stackoverflow.com/a/5971247/373861 এবং stackoverflow.com/a/3849602/373861 । আমি এই বিশেষ নীতিটি বাইটকোড উপকরণের জন্য প্রয়োজন বর্জনীয়। যদিও আমি নিজেই এটি ব্যবহার করিনি।
ফ্যাভনিয়াস

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

@ সুশান্ত: আচ্ছা আমি নিশ্চিত নই যে এটি কোথায় :)। যদিও অবহেলিতapt হয়েছে তবে এই ডকস.ওরাকল . com/ জাভ্যাস / / / ডকস / টেকনোটস / গাইডস / অ্যাপ্লিকেশন / দেখুন । প্রতিবিম্ব ব্যবহার করে টিকা আবিষ্কার করার জন্য ইন্টারনেটে একাধিক টিউটোরিয়াল রয়েছে। আপনি মধ্যে খুঁজছেন দ্বারা শুরু করতে পারেন java.lang.Class::getAnno*এবং একই পদ্ধতি java.lang.reflect.Methodএবং java.lang.reflect.Field
ফ্যাভনিয়াস

57

শ্রেণি পচা সম্পর্কে আপনার মন্তব্য অনুসারে, আমি কীভাবে এটি কাজ করা উচিত বলে মনে করি:

  • RetentionPolicy.SOURCE: পচা ক্লাসে উপস্থিত হবে না

  • RetentionPolicy.CLASS: পচা ক্লাসে উপস্থিত হন, তবে প্রতিফলনের সাথে রান-টাইমে পরিদর্শন করা যায় না getAnnotations()

  • RetentionPolicy.RUNTIME: পচা ক্লাসে উপস্থিত হবে, এবং প্রতিফলনের সাথে রান-টাইমে পরিদর্শন করা যেতে পারে getAnnotations()


হ্যাঁ আমাকেও তাই ভাবা হয়েছিল কিন্তু পচা ক্লাসে কিছুই উপস্থিত নেই !!! এবং তাই আমি বিভ্রান্ত ... আমি জাভাপ সরঞ্জাম দিয়ে ক্লাস ফাইলটি পরিদর্শন করার চেষ্টা করব
xdevel2000

জাভাপ কিছুই ফিরিয়ে দেয় না তখন কোথায় রাখা হয়?
xdevel2000

1
রিটেনশনপলিসি.ক্লাএসএসএস এর কোনও ব্যবহারের ক্ষেত্রে?
রাহুল

20

ন্যূনতম চলমান উদাহরণ

ভাষা স্তর :

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

@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}

@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}

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

public static void main(String[] args) {
    @RetentionSource
    class B {}
    assert B.class.getAnnotations().length == 0;

    @RetentionClass
    class C {}
    assert C.class.getAnnotations().length == 0;

    @RetentionRuntime
    class D {}
    assert D.class.getAnnotations().length == 1;
}

বাইটকোড স্তর : ব্যবহার করে javapআমরা লক্ষ্য করি যে Retention.CLASSটীকাযুক্ত শ্রেণি একটি রানটাইম ইনভিজিবল শ্রেণীর বৈশিষ্ট্য পেয়েছে :

#14 = Utf8               LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
  0: #14()

যখন Retention.RUNTIMEটীকাটি একটি রানটাইমভিজিবল শ্রেণীর বৈশিষ্ট্য পায় :

#14 = Utf8               LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
  0: #14()

এবং Runtime.SOURCEসটীক .classকোনো টীকা পাবেন না।

আপনার সাথে খেলতে গিটহাবের উদাহরণ


সুতরাং রানটাইম.সোর্স এবং রানটাইম.ক্ল্যাসের ব্যবহার কী?
প্রবীণ কামাথ

@ প্রবীণকামথ আমি তাদের কোনও উদাহরণই জানি না যেখানে তারা দরকারী। সম্ভবত যদি আপনি নিম্ন স্তরের জেভিএম স্টাফ করে থাকেন যা বেশিরভাগ ডেভস কখনও করেন না তবে সম্ভবত ঘটে। আপনি যদি তাদের জন্য কোনও আবেদন পান তবে আমাকে জানান।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

5

ধরে রাখার নীতি: একটি ধারণার নীতি নির্ধারণ করে যে কোন বিন্দুটিকে বাতিল করা হয়। এটি জাভা অন্তর্নির্মিত টীকাগুলি ব্যবহার করে নির্দিষ্ট করা হয়েছে: @Retention[সম্পর্কে]

1.SOURCE: annotation retained only in the source file and is discarded
          during compilation.
2.CLASS: annotation stored in the .class file during compilation,
         not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.

0
  • ক্লাস : টীকা সংকলক দ্বারা ক্লাস ফাইলে রেকর্ড করতে হয় তবে রান সময় ভিএম দ্বারা বজায় রাখা দরকার হয় না।
  • রুনটাইম : টীকাগুলি ক্লাস ফাইলে সংকলক দ্বারা রেকর্ড করতে হবে এবং রান সময়ে ভিএম দ্বারা রক্ষণাবেক্ষণ করতে হবে, যাতে সেগুলি প্রতিফলনযোগ্যভাবে পড়তে পারে।
  • উত্স : টীকাগুলি সংকলক দ্বারা বাতিল করা হয়।

ওরাকল ডক

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