<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>انوتیشن &#8211; Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/tag/%D8%A7%D9%86%D9%88%D8%AA%DB%8C%D8%B4%D9%86/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mahditajik.ir</link>
	<description>I&#039;m Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</description>
	<lastBuildDate>Thu, 29 Nov 2018 14:21:09 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>

<image>
	<url>http://www.mahditajik.ir/wp-content/uploads/2015/03/cropped-sample-logo-MT-2-32x32.png</url>
	<title>انوتیشن &#8211; Mahdi Tajik</title>
	<link>http://www.mahditajik.ir</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Java Annotation چیست؟</title>
		<link>http://www.mahditajik.ir/java-annotation-%da%86%db%8c%d8%b3%d8%aa%d8%9f/</link>
					<comments>http://www.mahditajik.ir/java-annotation-%da%86%db%8c%d8%b3%d8%aa%d8%9f/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Mon, 01 Aug 2016 15:26:26 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[IntDef]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[StringDef]]></category>
		<category><![CDATA[انوتیشن]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=1981</guid>

					<description><![CDATA[<p>, جاوا انوتیشن اطلاعات اضافی به کد ما اضافه می کند که بخشی از برنامه نیست ولی تاثیر در اجرای برنامه می گذارد. Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate. موضاعات ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/java-annotation-%da%86%db%8c%d8%b3%d8%aa%d8%9f/">Java Annotation چیست؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-1990" src="http://www.mahditajik.ir/wp-content/uploads/2016/07/annotitaion.jpg" alt="annotitaion" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/07/annotitaion.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2016/07/annotitaion-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2016/07/annotitaion-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>, جاوا انوتیشن اطلاعات اضافی به کد ما اضافه می کند که بخشی از برنامه نیست ولی تاثیر در اجرای برنامه می گذارد.</p>
<blockquote><p><a href="https://docs.oracle.com/javase/tutorial/java/annotations/" target="_blank" rel="noopener"><em>Annotations</em>, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.</a></p></blockquote>
<p style="text-align: justify;">موضاعات مهمی که در انوتیشن مطرح است عبارتند از اطلاع رسانی به کامپایلر، انجام پردازش در زمان کامپایل و همچنین پردازش در زمان اجرا می باشد. انوتیشن ها توسط کامپایلر و یا ابزارهای تجزیه انوتیشن، تجزیه می شوند. قبل از این اطلاعات اضافی در javadoc قرار می گرفت، ولی توسط انوتیشن این اطلاعات را می توان در زمان کامپایل و حتی در زمان اجرا داشته باشیم. چند مثالی کاربردی خواهیم داشت و امیدوارم تا آخر این آموزش با من همراه باشید.</p>
<p style="text-align: justify;">انوتیشن های زیادی توسط خود زبان جاوا استفاده می شوند که شاید با خیلی از آنها همچون @Override آشنا باشید. علاوه بر انواع موجود می توان انوتیشن اختصاصی داشته باشیم که در مثال های بعدی با آنها مواجه خواهیم شد. توجه داشته باشید که انوتیشن می تواند ورودی داشته باشد یا اینکه نداشته باشد.</p>
<p style="text-align: justify;">چند نمونه:</p>
<p style="text-align: justify;"><b>@Override</b>  به کامپایلر می گوید که متد اظهار شده در کلاس اصلی را با دستوراتی ما بازنویسی کند.</p>
<p style="text-align: justify;"><b>@SuppressWarnings</b> می گوید که اخطارها را سرکوب کن. گرچه نمایش اخطار مفید است ممکن است در مواردی بخواهیم تا کامپایلر اخطاری را نمایش ندهد.</p>
<pre class="crayon-plain-tag">@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@SuppressWarnings("unused")
public void unusedmethod(){

    //some methods
}

@SuppressWarnings("deprecation")
public void oldmethdthatDepricated(){

    //some methods
}</pre>
<p style="text-align: justify;">بعضی انوتیشن ها هم برای توصیف انوتیشن های دیگر بکار می رود. یعنی انوتیشن برای انوتیشن:</p>
<p style="text-align: justify;"><b>@Retention</b> می گوید که انوتیشن موردنظر چگونه ذخیره شود. استفاده است مثلا <code>RetentionPolicy.SOURCE</code>  انوتیشن اشاره شده در سطح سورس کدمی ماند و توسط کامپایلر قابل دسترسی نباشد. اگر مقدار را  <code>RetentionPolicy.CLASS </code> بگذاریم باعث می شود که انوتیشن مان در زمان کامپایل در نظر گرفته شود و توسط JVM ایگنور شود و یا توسط <code>RetentionPolicy.RUNTIME</code> انوتیشنمان توسط JVM نگهداری شود و در زمان اجرا قابل استفاده است.</p>
<p style="text-align: justify;"><b>@Documented</b> می گوید که انوتیشن بکار رفته باید توسط ابزار سندسازی جاوا به سند تبدیل شوند.</p>
<p style="text-align: justify;"><b>@Target</b>  توسط این انوتیشن، دسترسی المنت های جاوا به انوتیشن ما را محدود می کند و انواع انتخاب شده می توانند به انوتیشن ما دسترسی داشته باشند.</p>
<p style="text-align: justify;"><b>@Inherited</b> توجه کنید که انوتیشن ها ارث بری ندارند. یعنی مثلا اگر یک کلاسی با یک انوتیشن خاصی درست کردید و یک کلاس دیگر از آن مشتق شد اگر از این انوتیشن استفاده نکرده باشید کلاس جدید انوتیشن های پدر را به ارث نمی برد. در مثالی که بعد از تعاریف می زنم تمام این مطالب را نمایش خواهم داد.</p>
<p style="text-align: justify;"><b>@Repeatable</b>  این امکان در جاوای ۸ اضافه شده که می توانیم چند انوتیشن یکسان ولی با مقادیر مختلف را به یک متد اضافه کنیم. مثلاً در مثال زیر دوبار انوتیشن آلارم را با دو role متفاوت اعمال کردیم.</p>
<pre class="crayon-plain-tag">@Alert(role="Manager")
@Alert(role="Administrator")
public class UnauthorizedAccessException extends SecurityException { ... }</pre>
<p style="text-align: justify;">حال که با برخی انوتیشن های پیش فرض آشنا شدیم می خواهیم نحوه ساخت انوتیشن را باهم برسی کنیم. انوتیشن بسیار شبیه به اینترفیس ساخته می شود با این تفاوت که از کاراکتر @ استفاده می کنیم.</p>
<pre class="crayon-plain-tag">package com.example.mtajik.annotationtest;


import java.lang.annotation.*;

@Inherited
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

@interface BasicInformation {
    String corpId() default "mobiro";
    String corpAddress() default "kordestan .st";
}</pre>
<p style="text-align: justify;">انوتیشنی ساختیم که اطلاعات کلی کارمندان را نگهداری می کند. همانطور که ملاحظه می کنید انوتیشن می تواند متد داشته باشد. متد های آن می تواند مقدار پیش فرض داشته باشد. همچنین انوتیشن ما خودش چند انوتیشن دارد که در بالا تعریف کردیم. سپس کلاس کارمند با انوتیشن تولید شده را بصورت زیر می سازیم:</p>
<pre class="crayon-plain-tag">package com.example.mtajik.annotationtest;

@BasicInformation(corpId="Irancell", corpAddress="Vanak .ave")
public class Employee {
    String eId;
    String eName;
    public Employee(String eId, String eName){
        this.eId = eId;
        this.eName = eName;
    }

    public void getEmployeeDetails(){
        System.out.println("Employee ID: "+eId);
        System.out.println("Employee Name: "+eName);
    }
}</pre>
<p style="text-align: justify;">سپس کلاس زیر را بسازید و برنامه را اجرا کرده و نتیجه را در کنسول ببینید. همانطور که در اول اشاره کردم این کلاس همان ابزار تجزیه انوتیشن است که توسط reflection در هنگام Runtime انوتیشن های موجود در کلاس را گرفته و نتیجه را نمایش می دهد.</p>
<pre class="crayon-plain-tag">package com.example.mtajik.annotationtest;


import java.lang.annotation.Annotation;
public class TestCustomAnnotationBasicBenefits {
    public static void main(String[] args) throws Exception{
        Employee emp = new Employee("E-100", "user3320018");
        emp.getEmployeeDetails();
        Class reflectedClass = emp.getClass();

        Annotation informationAnn = reflectedClass.getAnnotation(BasicInformation.class);
        BasicInformation bBenefits = (BasicInformation)informationAnn;
        System.out.println("corporation ID: "+bBenefits.corpId());
        System.out.println("corporation address: "+bBenefits.corpAddress());
    }
}</pre>
<p style="text-align: justify;">ملاحظه کردید که چگونه می توان با استفاده از Annotation از Meta-data در هنگام Runtime دسترسی پیدا کرد و استفاده کرد.</p>
<p style="text-align: justify;">همچنین می توان با استفاده از انوتیشن نوع ورودی را برای یک تابع محدود کرد و با آن مانند enum برخورد کرد. هرچند به نظر شخصی بنده بسیار مفید تر از enum خواهد بود زیرا اطلاعاتی به همراه دارد که بسیار جای مانور دارد. به مثال زیر توجه کنید.</p>
<p style="text-align: justify;"><strong>IntDef</strong></p>
<p style="text-align: justify;">انوتیشنی است که توسط آن یک عنصر  integer را ارائه می دهد که در هنگام استفاده فقط می توانیم از مقادیر داده شده استفاده کنیم. ما یک انوتیشن داریم به عنوان روزهای هفته که انواع آن را از مقادیر static انتخاب کردیم. ( انواع آن روزهای هفته است)</p>
<pre class="crayon-plain-tag">static public final int SHANBE_ = 0;
static public final int YEK_SHANBE_ = 1;
static public final int DO_SHANBE = 2;
static public final int SE_SHANBE_ = 3;
static public final int CHAHR_SHANBE_ = 4;
static public final int PANJ_SHANBE_ = 5;
static public final int JOMHE_ = 6;</pre>
<pre class="crayon-plain-tag">@IntDef({SHANBE_, YEK_SHANBE_,DO_SHANBE,SE_SHANBE_,CHAHR_SHANBE_,PANJ_SHANBE_, JOMHE_})
@Retention(RetentionPolicy.SOURCE)
@Inherited
public @interface RozayeHafte {}</pre>
<p style="text-align: justify;">حال متدی برای محاسبه حقوق داریم که ورودی آن را از جنس این انوتیشن می گذاریم. حال هر جا که متد را صدا بزنید intellisense ide یعنی Android Studio به عوان ورودی پیش فرض همان روز ها را به ما پیشنهاد می دهد! جالب است نه؟ این همان کاری است که در هنگام انتخاب visibility در View خودش بطور پیش فرض GONE و Visible و Invisible را پیشنهاد می دهد و اگر سورس کد View را در SDK های زیر ۲۲ ببینید ملاحظه خواهید کرد که از همین روش برای مشخص کردن ورودی هایش استفاده کرده است.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2022" src="http://www.mahditajik.ir/wp-content/uploads/2016/08/test.jpg" alt="test" width="782" height="622" srcset="http://www.mahditajik.ir/wp-content/uploads/2016/08/test.jpg 782w, http://www.mahditajik.ir/wp-content/uploads/2016/08/test-300x239.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2016/08/test-768x611.jpg 768w" sizes="(max-width: 782px) 100vw, 782px" /></p>
<p>&nbsp;</p>
<p>استفاده از <strong>StringDef</strong> هم بهمین صورت است با این تفاوت که انواع آن string هستند.</p>
<p>سورس کامل</p><pre class="crayon-plain-tag">public class MainActivity extends AppCompatActivity {
    
    static public final int SHANBE_ = 0;
    static public final int YEK_SHANBE_ = 1;
    static public final int DO_SHANBE = 2;
    static public final int SE_SHANBE_ = 3;
    static public final int CHAHR_SHANBE_ = 4;
    static public final int PANJ_SHANBE_ = 5;
    static public final int JOMHE_ = 6;

    static public final String GHAWY = "ghavi";
    static public final String ZAEEF = "zaeef";
    static public final String PIZORI = "pizoori";


    public void mohasebeheHoggogh(@RozayeHafte int day, @GhodratBadani String body) {

        switch (day) {
            case SHANBE_:
                Toast.makeText(MainActivity.this, body + " SHANBE_", Toast.LENGTH_SHORT).show();
                break;
            case YEK_SHANBE_:
                Toast.makeText(MainActivity.this, body + " YEK_SHANBE_", Toast.LENGTH_SHORT).show();
                break;
            case JOMHE_:
                Toast.makeText(MainActivity.this, body + " JOMHE_", Toast.LENGTH_SHORT).show();
                break;
        }

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mohasebeheHoggogh(JOMHE_, GHAWY);
    }

    private enum RozhayeHafteType2 {
        SHANBE_,
        YEK_SHANBE_,
        JOMHE_

    }

    @IntDef({SHANBE_, YEK_SHANBE_, DO_SHANBE, SE_SHANBE_, CHAHR_SHANBE_, PANJ_SHANBE_, JOMHE_})
    @Retention(RetentionPolicy.SOURCE)
    @Inherited
    public @interface RozayeHafte {
    }


    @StringDef({GHAWY, ZAEEF, PIZORI})
    @Inherited
    @Retention(RetentionPolicy.SOURCE)
    public @interface GhodratBadani {
    }
}</pre><p>
منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/java-annotation-%da%86%db%8c%d8%b3%d8%aa%d8%9f/">Java Annotation چیست؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/java-annotation-%da%86%db%8c%d8%b3%d8%aa%d8%9f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
