@ ওভাররাইডের মতো টিকা কীভাবে জাভাতে অভ্যন্তরীণভাবে কাজ করে?


93

জাভাতে টীকা কীভাবে অভ্যন্তরীণভাবে কাজ করে তা আমাকে কেউ ব্যাখ্যা করতে পারেন?

আমি জানি জাভাতে java.lang.annotation লাইব্রেরি ব্যবহার করে আমরা কীভাবে কাস্টম টীকা তৈরি করতে পারি। তবে এটি এখনও অভ্যন্তরীণভাবে কীভাবে কাজ করছে তা আমি পাই না উদাহরণস্বরূপ, @ ওভারাইড টীকা।

কেউ যদি বিশদভাবে এটি ব্যাখ্যা করতে পারে তবে আমি সত্যিই কৃতজ্ঞ হব।


4
"অভ্যন্তরীণভাবে কাজ" বলতে কী বোঝ? সংকলক? রানটাইম?
ক্রাইলিস -কোটিরিওপটিস্টিক-

4
@ ক্রাইলিস ওয়ার্কের অভ্যন্তরীণ অর্থ হল কীভাবে এটি স্বয়ংক্রিয়ভাবে চিহ্নিত হয়ে যায় যে এই পদ্ধতিটি ওভাররাইড পদ্ধতি বা এটি একটি ওভাররাইড পদ্ধতি নয়। এটি উভয় সময়ে কাজ। সংকলনের সময় ওভাররাইড টীকা রচনার কাজ এবং বসন্ত নিয়ন্ত্রক টীকা রানটাইমের কাজ
চিরাগ দাসানী

উত্তর:


140

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

যখন টীকা সঙ্গে কোড কম্পাইল, কম্পাইলার টীকা ঠিক যেমন এক্সেস সংশোধনকারীদের (যেমন উৎস উপাদানে অন্যান্য সংশোধনকারীদের, দেখেন দেখেন public/ private) অথবা final। যখন এটি কোনও টীকাটির মুখোমুখি হয়, তখন এটি একটি টীকাগুলি প্রসেসর চালায়, যা প্লাগ-ইন ক্লাসের মতো যা বলে যে এটি একটি নির্দিষ্ট টীকাতে আগ্রহী। টীকাগুলি প্রসেসর সাধারণত সংকলনকৃত উপাদানগুলি পরিদর্শন করতে প্রতিবিম্ব এপিআই ব্যবহার করে এবং কেবল তাদের উপর চেক চালাতে, তাদের সংশোধন করতে বা সংকলনের জন্য নতুন কোড উত্পন্ন করতে পারে। @Overrideপ্রথমটির উদাহরণ; এটি সুপারক্লাসগুলির মধ্যে একটিতে পদ্ধতি স্বাক্ষরের জন্য কোনও মিল খুঁজে পেতে পারে তা নিশ্চিত করতে এটি প্রতিবিম্ব এপিআই ব্যবহার করে Messagerএবং এটি না পারলে একটি সংকলন ত্রুটির কারণ হিসাবে ব্যবহার করে ।

রচনা টীকা প্রসেসরের উপর প্রচুর টিউটোরিয়াল উপলব্ধ; এখানে একটি দরকারী এক । সংকলক কীভাবে একটি টীকা প্রসেসরের ডাক দেয় তার Processorইন্টারফেসের পদ্ধতিগুলি দেখুন ; মূল অপারেশনটি processপদ্ধতিতে সঞ্চালিত হয় , যাকে প্রতিবার সংকলকটি এমন কোনও উপাদান দেখায় যার সাথে মিল রয়েছে that


4
স্প্রিংয়ের টিকা রচনা প্রসেসর ঠিক কীভাবে @ কমপোনেন্টটি পার্স করে এবং তার ধারকটিতে ক্লাসটি ইনজেক্ট করেছে
জুনচেন লিউ

@ শ্যান্যাংকু এই প্রশ্নের জন্য অফ-টপিক, যা স্প্রিং-নির্দিষ্ট নয়। আপনি পোস্টপ্রসেসর ক্লাস নিজেই পড়তে পারেন।
ক্রাইলিস -কোটিরিওপটিস্টিস্টিক-

42

অন্যরা যা পরামর্শ দিয়েছে সেগুলি ছাড়াও, টীকাটি কীভাবে কাজ করে তা দেখতে আপনাকে প্রথমে একটি কাস্টমাইজড টিকা রচনা এবং এর প্রসেসরটি স্ক্র্যাচ থেকে লেখার পরামর্শ দিন।

আমার নিজের হিসাবে, উদাহরণস্বরূপ, সংকলন পদ্ধতিতে পদ্ধতিগুলি ওভারলোড করা হচ্ছে কিনা তা পরীক্ষা করার জন্য আমি একটি টীকা লিখেছি।

প্রথমত, নামের একটি টীকা তৈরি করুন Overload। এই টীকাটি পদ্ধতিতে প্রয়োগ করা হয় তাই আমি এটি দিয়ে এটিকে টীকা করি@Target(value=ElementType.METHOD)

package gearon.customAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(value=ElementType.METHOD)
public @interface Overload {

}

এর পরে, সংজ্ঞায়িত টীকাগুলি দ্বারা টীকাযুক্ত উপাদানগুলি হ্যান্ডেল করতে সংশ্লিষ্ট প্রসেসর তৈরি করুন। দ্বারা বর্ণিত পদ্ধতির জন্য @Overload, এর স্বাক্ষরটি অবশ্যই একাধিকবার উপস্থিত হতে হবে। অথবা ত্রুটিটি মুদ্রিত হয়।

package gearon.customAnnotation;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;

@SupportedAnnotationTypes("gearon.customAnnotation.Overload")

public class OverloadProcessor extends AbstractProcessor{

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // TODO Auto-generated method stub
        HashMap<String, Integer> map = new HashMap<String, Integer>();

        for(Element element : roundEnv.getElementsAnnotatedWith(Overload.class)){
            String signature = element.getSimpleName().toString();
            int count = map.containsKey(signature) ? map.get(signature) : 0;
            map.put(signature, ++count);
        }

        for(Entry<String, Integer> entry: map.entrySet()){
            if(entry.getValue() == 1){
                processingEnv.getMessager().printMessage(Kind.ERROR, "The method which signature is " + entry.getKey() +  " has not been overloaded");
            }
        }
        return true;
    }
}

প্যাকেজিং টীকা এবং এর প্রক্রিয়াটিকে একটি জার ফাইলে পরিণত করার পরে, একটি ক্লাস তৈরি করুন @Overloadএবং এটি সংকলন করতে জাভ্যাক.এক্সই ব্যবহার করুন।

import gearon.customAnnotation.Overload;

public class OverloadTest {
    @Overload
    public static void foo(){
    }

    @Overload
    public static void foo(String s){

    }

    @Overload
    public static void nonOverloadedMethod(){

    }
} 

যেহেতু nonOverloadedMethod()আসলে অতিরিক্ত লোড করা হয়নি, তাই আমরা নীচের মতো আউটপুট পাব:

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


উপরের তথ্যটি জেডিকে 6 (তার জন্য +1) এর প্রতি খুব ভাল সম্মান, তবে জেডিকে 5 ব্যবহার করে কীভাবে একই জিনিস অর্জন করবেন? জেডি কে Supp সাপোর্টেড অ্যানোটেশনেশন টাইপস, অ্যাবস্ট্রাক্ট প্রসেসর ক্লাসটি সহজ হয়ে উঠেছে তবে কীভাবে একই ঘটনাটি অতীতে ঘটেছিল (জেডি কে 5 তে স্প্রিং ফ্রেম ওয়ার্ক 2.5 এর মত)? জেভিএম কীভাবে জেডি কে 5 এর ক্লাসের মতো টিকা প্রোটেসর সনাক্ত করে? আপনি দয়া করে উত্তরটি 2 বিভাগে সম্পাদনা করে গাইড করতে পারেন (জেডিকে 5 এর জন্য একটি, বর্তমান সংস্করণ কি জেডকি 6 এর জন্য)?
প্রিজিতগন্ধি

আপনার ক্লাসে OverloadProcessor::processএটা কেন entry.getValue() == 1? কাউকে প্যারেন্ট ক্লাস / ইন্টারফেসে টীকাগুলি যুক্ত করতে roundEnv.getElementsAnnotatedWith(Overload.class)হবে না , তাই প্যারেন্ট ক্লাস / ইন্টারফেস পাবেন না , তাই না?

আমি এই অংশে বিভ্রান্ত কিন্তু আমি মনে করি আপনার উত্তরটি খুব সহায়ক।
16:53

@ s̮̦̩e̝͓c̮͔̞ṛ̖̖e̬̣̦t̸͉̥̳̼ যদি কোনও পদ্ধতিকে ওভারলোড হিসাবে বিবেচনা করা হয় তবে ক্লাসে একই নামে সংজ্ঞায়িত আরও একটি পদ্ধতি থাকতে হবে।
ইউজিন

4
@ ওভারলোডেড কোনও পদ্ধতির জন্য পুনরায় ব্যবহার করা, এটি একই শ্রেণিতে একাধিকবার উপস্থিত হতে হবে তবে যদি এটি `== 1` হয় তবে এটি একটি ত্রুটি।
কৃষাপ্রকাশক

5

এখানে @Override: http://www.docjar.com/html/api/java/lang/Override.java.html

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


4
আমি ওভাররাইড টীকাটির উত্স কোডটি জানি। তবে এটি অভ্যন্তরীণভাবে কীভাবে কাজ করছে। এটি কীভাবে এটি চিহ্নিত করা যায় যে এই পদ্ধতিটি ওভাররাইড পদ্ধতি নয় বা এইটি ওভাররাইড পদ্ধতি? বা আমি আমার কাস্টম ওভাররাইড টীকা তৈরি করতে পারি? এবং এটি জাভা ওভাররাইড টীকা হিসাবে ঠিক একই আচরণ করা উচিত
চিরাগ দাসানী

4
আমি আমার উত্তরে যেমনটি বলেছি, আচরণটি টীকাটির অংশ নয়। ব্যাখ্যাটি এমন জিনিসগুলির মধ্যে রয়েছে যা টীকাটি গ্রাস করে। এ কারণে, আপনি গ্রাহককে পরিবর্তন না করা আপনি ব্যবহারিকভাবে নিজের কাস্টম সংস্করণ @Override(বা অন্যান্য মানক টীকা) তৈরি করতে পারবেন না ।
ম্যাট বল

3

মূলত, টীকাগুলি কেবল চিহ্নিতকারী যা সংকলক বা অ্যাপ্লিকেশন দ্বারা পড়া হয়। তাদের ধারণার নীতির উপর নির্ভর করে এগুলি কেবল সংকলনের সময় উপলভ্য বা প্রতিচ্ছবি ব্যবহার করে রানটাইমে পাঠযোগ্য।

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


3

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

এছাড়াও আমি আরও রেফারেন্স যুক্ত করছি।

  1. http://www.codeproject.com/Articles/272736/ স্বীকৃতি- টীকাগুলি- ইন- জাভা
  2. http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/package-summary.html
  3. http://www.coderanch.com/how-to/java/AnnotationsExample

@ লুইগিগেনডোজা জাভা ১.7 টীকা ডক যোগ করেছেন
রুচিরা গায়ান রানাভিরা

@ রুচিরা আমাকে সমস্ত লিঙ্ক খুলেছে কিন্তু এখনও এটি কীভাবে কাজ করছে তা আমি পরিষ্কার করি না। আপনি কি আমাকে বিশদগুলিতে ব্যাখ্যা করতে পারেন যেমন বসন্তের টীকা হিসাবে বিবেচনা করুন। স্প্রিং.এক্সএমএল ফাইলটিতে কোনও কনফিগারেশন না লিখে টীকা ব্যবহার করে আমি সমস্ত জিনিস করতে পারি। এটি কি অভ্যন্তরীণভাবে এক্সএমএল কনফিগারেশনের সাথে টীকা যুক্ত করে?
চিরাগ দাসানী


0

এমনকি আমি একই প্রশ্নের উত্তর খুঁজছিলাম। নীচের লিঙ্কটি টীকাগুলির অভ্যন্তর পেতে সম্মিলিত ভাল জিনিস সরবরাহ করেছে। https://dzone.com/articles/how-annotations-work-java আশা করি এটি সাহায্য করবে!

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