android注解入门 并来自己写一个框架
android开发与架构设计解析

f. 在Target面板的Automatic中勾选相应的AVD, 如果没有可用的AVD的话,你需要点击右下角的 Manager…,然后新建相应的AVD。如下图所示:
g. 然后点Run按钮即可,运行成功的话会有 Android的模拟器界面,如下图所示:
相关参数的说明:
A. Project Name: 包含这个项目的文件夹的名称。 B. Package Name: 包名,遵循JAVA规范,用包名来区 分不同的类是很重要的,我用的是helloworld.test。 C. Activity Name: 这是项目的主类名,这个类将会是 Android的Activity类的子类。一个Activity类是一 个简单的启动程序和控制程序的类。它可以根据需 要创建界面,但不是必须的。 D. Application Name: 一个易读的标题在你的应用程序 上。 E. 在"选择栏"的 "Use default location" 选项,允许你 选择一个已存在的项目。
安装完成之后,可以在检查JDK是否安装成功。 打开cmd窗口,输入java –version 查看JDK的版本信 息。出现类似下面的画面表示安装成功了:
1.2、 Eclipse安装 如果你还没有Eclipse的话,可以先去下载,下载 如下图所示的Eclipse IDE for Java Developers (92M)的win 32bit版:解压之后既可使用。
确定返回后,在work with后的下拉列表中 选择我们刚才添加的 ADT,我们会看到下 面出有Developer Tools,展开它会有 Android DDMS 和Android Development Tool,勾选他们。 如右图所示: 完成之后: » 选择Window > Preferences... » 在左边的面板选择Android,然后在右侧 点击Browse...并选中SDK路径,本机为: D:\AndroidDevelop\android-sdkwindows » 点击Apply、OK。配置完成。
Android系统架构及内核简介

Android系统架构及内核简介(来源于ThinkPHP)Android是Google公司开发的基于Linux平台的开源⼿机操作系统,它包括操作系统、中间件、⽤户界⾯和应⽤程序,⽽且不存在任何以往阻碍移动产业创新的专利权障碍,并由Google公司于2007年11⽉5⽇正式发布。
同时,Google公司组建了⼀个开放⼿机联盟,这个联盟由中国移动、摩托罗拉、⾼通、宏达电和T-Mobile等在内的全球30多家技术和⽆线应⽤的领军企业组成,Google通过与运营商、设备制造商、开发商和其他有关各⽅结成深层次的合作伙伴关系,希望借助建⽴标准化、开放式的移动电话软件平台,在移动产业内形成⼀个开放式的⽣态系统;可预见地,⽣产和使⽤基于 Android系统的嵌⼊式⼿持移动设备将是未来的发展趋势,对相应软件的需求量也将⽇趋增长,因此对Android系统内部作⼀个完整和深⼊的分析,对基于Android平台的软件移植和开发是很有益处的。
1 Android系统平台架构对操作系统⽽⾔,必须做到设计合理、层次分明,同时还需考虑整个系统的结构要聚耦适当,Android系统是基于linux内核的,因此还必须具备开源的特性,以符合开源⼈员共同⼯作。
从系统的组成要件来讲,Android平台架构包括硬件设备、板级⽀持包、驱动程序、操作系统内核、程序运⾏库,运⾏框架,应⽤程序等,它们的有机结合和协同⼯作共同完成了整个系统的正常运⾏和对事务的处理。
依据Google开源资料可知,整个系统由Linux内核、程序库、Android Runtime、应⽤程序框架和应⽤程序等5部分组成,,系统架构如图1所⽰。
参照图1,由上⽽下对组成系统各部分的主要组件作以下描述。
1.1 Linux内核Android基于Linux 2.6内核,但并⾮完全照搬内核,⽽是对内核作了部分增删和修改,在Linux 2.6内核的基础上,Android核⼼系统实现了安全性、内存管理、进程管理、⽹络协议栈和驱动模型等功能,Linux内核也同时作为硬件和软件栈之间的抽象层。
安卓android框架与应用开发介绍(7)

实现一个BroadcastReceiver
public class MyAndroidReceiver extends BroadcastReceiver override onReceive(Context context, Intents Intents)
权限举例(参考android. Manifest.permission)
权限名称 接收短信
拨打电话 系统启动完毕通知 读取联系人信息 修改联系人信息
权限描述 android.permission.RECEIVE_SMS
android.permission.CALL_PHONE android.permission.RECEIVE_BOOT_COMPLETED android.permission.READ_CONTACTS android.permission.WRITE_tsFilter filter = new IntentsFilter(NEW_BROADCAST ); MyAndroidReceiver MyAndroidReceiver = new MyAndroidReceiver(); registerReceiver(MyAndroidReceiver , filter);
/ 安卓手机论坛
3
目录
Android的发展
初探Android框架
如何开发一个android应用
如何开发一个widget
1
Broadcast receiver生命周期
Broadcast receiver对象在onReceive返回后被销毁
onReceive中不适合处理异步过程。例如弹出对话框 与用户交互,可使用消息栏替代。
第1章 Android基础入门(Anddroid)

在XML布局文件中调用名为app_name字符串资源 @string/app_name
✎ 1.5.5 颜色资源
颜色资源
– 定义位置:res/values/文件夹的colors.xml文件中 – colors.xml文件中的颜色资源
用于<定?xm义l 颜ver色sio资n=源"1的.0"标en签coding="utf-8"?>
19.6%
4.5K-6K
0.7%
20K-30K
29.8%
10K-15K
22.3%
6K-8K
2.8%
8K-10K
5.7%
¥18610
取自12554份样本可供参考 截止至2018年12月
数据来源:职友集
✎ 1.1.1 通信技术
通信技术
第一代通信技术(1G):是指最初的模拟、仅限语音的蜂窝电话 标准。
使用AndroidStudio创建程序, 使用模拟器运行程序。
① 在Android Studio的Welcome to Android Studio窗 口中选择【Start a new Android Studio project】选 项创建项目
② 点击工具栏中【AVD Manager】标签启动模拟器
✎ 1.5.5 颜色资源
颜色资源
– 调用方式
➢ 通过Java代码调用颜色资源
在Activity的onCreate()方法中调用名为colorPrimary的颜色资源 getResources().getColor(R.color.colorPrimary);
➢ 在XML布局文件中调用布局资源文件
//在XML布局文件中调用activity_main.xml布局资源 <include layout="@layout/activity_main"/>
第1章 Android基础入门

July 2012
KitKat
4.4 - 4.4.4
Oct 2013
Lollipop
5.0 - 5.1.1
Nov 2014
Marshmallow
6.0 - 6.0.1
Oct 2015
Nougat
7.0 - 7.1
Sept 2016
Oreo
8.0 - 8.1
Sept 2017
Pie
9.0
Aug 2018
2021/10/19
第1章 Android基础入门
7
智能手机操作系统市场份额
数据来源:https:///cn/smartphone-os-market-share/
2021/10/19
第1章 Android基础入门
8
Android的优势
基于开源技术 自由度高 选择多样化 广泛的开发群体
2021/10/19
第1章 Android基础入门
6
Android和iOS的区别
对比项目
Android
iOS
开发语言
Java、Kotlin
Objective-c、Swift
系统开放性 Android源码开放,开放性更好 封闭操作系统,开放性较差
系统安全性 源代码开放,安全性较差
封闭操作系统,安全性更高
Dalvik通过一组C核心库调用Linux内核的功能,同时基于Dalvik向上提供了一个 功能完备的SDK
为了能充分利用已有的基础,Android SDK尽量与Java SE保持一致,这使得 Android应用的开发与普通Java应用程序的开发高度类似
2021/10/19
第1章 Android基础入门
使用Java开发Android应用程序的入门指南

使用Java开发Android应用程序的入门指南第一章:介绍Android是一种基于Linux内核的开放源代码移动设备操作系统,Java是Android应用程序开发的首选编程语言。
本章将介绍Android应用程序开发的基本概念和开发环境的设置。
1.1 Android应用程序开发概述Android应用程序开发是指使用Java语言和Android SDK (Software Development Kit)进行移动设备应用程序的开发。
Android应用程序可以在各种智能手机、平板电脑和其他移动设备上运行。
1.2 开发环境的设置要开始开发Android应用程序,你需要安装Android Studio(当前官方推荐的集成开发环境)以及Java开发工具包(JDK)。
Android Studio提供了一个全面的开发环境,可以帮助你编写、构建和调试应用程序。
第二章:入门指南本章将介绍如何使用Android Studio创建一个简单的Hello World应用程序,并进行基本的布局和事件处理。
2.1 创建一个新项目打开Android Studio,并选择“创建新项目”选项。
按照向导的指引,选择应用程序的名称、包名和最低支持的Android版本。
2.2 布局设计Android应用程序使用XML文件定义用户界面的布局方式。
打开活动的布局文件,并使用可视化工具来设计用户界面。
在布局文件中添加各种视图元素,如按钮、文本框和图片视图。
2.3 事件处理通过添加事件处理代码,使应用程序能够对用户的交互做出响应。
例如,当用户点击一个按钮时,应用程序可以执行特定的操作。
在Java代码中,实现事件处理逻辑,并将其与相应的视图元素关联起来。
第三章:核心概念本章将介绍Android应用程序开发中的核心概念,包括活动(Activity)、碎片(Fragment)、布局(Layout)和意图(Intent)等。
3.1 活动(Activity)活动是Android应用程序的基本组成单位,代表用户与应用程序之间的交互。
Android框架组件Lifecycle的使用详解
Android框架组件Lifecycle的使⽤详解1.前⾔Lifecycle是Google推出的⼀系列的框架组件的其中⼀个,主要是⽤来感知Activity和Fragment的⽣命周期。
本⽂主要介绍如何使⽤Lifecycle。
2.⼀个常见的开发例⼦public class TestActivity extends Activity{@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);xxx.onCreate();}@Overrideprotected void onStart() {super.onStart();xxx.onStart();}@Overrideprotected void onStop() {super.onStop();xxx.onStop();}}通常,我们都会写出⼀些类似上⾯的代码来监听⽣命周期。
如果有太多这样的调⽤将会使某个⽣命周期⽅法变的⾮常臃肿。
如下⼀段例⼦:@Overrideprotected void onStart() {super.onStart();xxx.onStart();xxx1.onStart();xxx2.onStart();//...}Lifecycle组件能够解决这个问题,从⽽使代码能够写得更优雅。
3.Lifecycle使⽤例⼦下⾯来看下如何使⽤Lifecycle。
3.1 添加依赖在相应的moudle⽬录下的build.gradle中添加以下依赖:dependencies {//...def lifecycle_version = "1.1.1"implementation "android.arch.lifecycle:runtime:$lifecycle_version"}3.2 实现LifecycleObserver接⼝public class TestLifeCycle implements LifecycleObserver {private static final String TAG = "test";@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void onCreate() {Log.d(TAG, "onCreate: ");}@OnLifecycleEvent(Lifecycle.Event.ON_START)public void onStart() {Log.d(TAG, "onStart: ");}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public void onResume() {Log.d(TAG, "onResume: ");}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public void onPause() {Log.d(TAG, "onPause: ");}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void onStop() {Log.d(TAG, "onStop: ");}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public void onDestroy() {Log.d(TAG, "onDestroy: ");}@OnLifecycleEvent(Lifecycle.Event.ON_ANY)public void onAny() {Log.d(TAG, "onAny: ");}}通过实现LifecycleObserver接⼝,然后在相应的⽅法上⾯添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。
【推荐下载】Android框架基础知识梳理
Android 框架基础知识梳理2017/02/22 0 转载自大神谷歌小弟的博客经过几年的发展和沉淀,Android 开发中涌现出许多优秀的框架,比如:Retrofit、Afinal、OKHttp、ButterKnife、AndFix 等等。
这些框架的出现极大地简化了开发流程,提高了工作效率。
在项目开发的过程中我们主要是使用这些轮子完成项目,很难有时间去顾及框架的内部实现。
在项目交付之后我们可能就要去看看这些框架的源码了。
这些主流框架的功能各不相同,但每当打开浩繁的源码时我们几乎都可以看到反射,注解,泛型的广泛应用;也正是这些技术使得框架具有了高度的灵活性,优良的扩展性和健壮的稳定性。
鉴于这些框架必备知识的重要性故在此对这部分内容做一个全面的梳理和总结主要内容:ClassLoader ClassLoader 的分析几种不同ClassLoader 的介绍ClassLoader 的应用泛型泛型的由来自定义泛型泛型的擦除反射class 常用反射技术Type 以及ParameterizedType 反射与泛型的结合使用注解常用注解的介绍和使用元注解自定义注解及其使用1. ClassLoader 在程序运行时首先要将类加载到内存中,这个加载工作就是由ClassLoader 完成的,故在中文文档中将其翻译为“类加载器”那么我们代码中所用到的类有什么不同呢?——它们的“来源”是不一样的有的类是属于系统提供的类,比如:String、Date、Object 等因此,在Android系统启动时会自动创建一个Boot 类型的ClassLoader,该ClassLoader 用于加载一些系统层级的类有的类属于我们自己写的类,比如:User、Girl、Beauty 等等因此,每个APP 会创建一个自己的ClassLoader 实例,该ClassLoader 用于加载dexprivate void getClassLoaders() { ClassLoader classLoader = getClassLoader(); while (null != classLoader) { System.out.println(“---- classLoader=“ + classLoader); classLoader = classLoader.getParent(); } }。
Android 动画框架详解
Android动画框架详解简介:Android平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果。
Android动画框架详解由原理篇和实例篇两部分组成。
本文是第一部分原理篇,主要分析Tween动画的实现原理,最后简单介绍在Android 中如何通过播放Gif文件来实现动画。
第二部分实例篇将在原理篇的基础上,向您展示一个动画实例的实现。
本文的标签:android标记本文!发布日期:2010年12月17日级别:中级访问情况14398次浏览建议:0(添加评论)平均分(共28个评分)Android平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述Android的动画框架是如何实现的。
任何一个框架都有其优势和局限性,只有明白了其实现原理,开发者才能知道哪些功能可以利用框架来实现,哪些功能须用其他途径实现。
Android平台提供了两类动画,一类是Tween动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是Frame动画,即顺序播放事先做好的图像,跟电影类似。
本文是由两部分组成的有关Android动画框架详解的第一部分原理篇,主要分析Tween动画的实现原理,最后简单介绍在Android中如何通过播放Gif文件来实现动画。
我们先看一下动画示例来一点感性认识。
Android动画使用示例使用动画示例程序的效果是点击按钮,TextView旋转一周。
读者也可以参看Apidemos中包com.example.android.apis.animationview下面的Transition3d和com.example.android.apis.view下面的Animation1/Animation2/Animation3示例代码。
清单1.代码直接使用动画package com.ray.animation;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.Button;public class TestAnimation extends Activity implements OnClickListener{public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);Button btn=(Button)findViewById(R.id.Button);btn.setOnClickListener(this);}public void onClick(View v){Animation anim=null;anim=new?RotateAnimation(0.0f,+360.0f);anim.setInterpolator(new AccelerateDecelerateInterpolator());anim.setDuration(3000);findViewById(R.id.TextView01).startAnimation(anim);}}使用XML文件方式,在打开Eclipse中新建的Android工程的res目录中新建anim文件夹,然后在anim目录中新建一个myanim.xml(注意文件名小写),内容如下:图1.使用xml文件方式其中的java代码如下:package com.ray.animation;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.TextView;public class TestAnimation extends Activity implements OnClickListener{ public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);Button btn=(Button)findViewById(R.id.Button01);btn.setOnClickListener(this);}@Overridepublic void onClick(View v){Animation anim=AnimationUtils.loadAnimation(this,R.anim.my_rotate_action);findViewById(R.id.TextView01).startAnimation(anim);}}回页首Android动画框架原理现有的Android动画框架是建立在View的级别上的,在View类中有一个接口startAnimation来使动画开始,startAnimation函数会将一个Animation类别的参数传给View,这个Animation是用来指定我们使用的是哪种动画,现有的动画有平移,缩放,旋转以及alpha变换等。
android自定义注解
android⾃定义注解1. 创建AnnotationProject2. 增加注解compile module必须java Library2.1 ⾃定义注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.CLASS)public @interface MyAnnotation {String name();}2.2 定义注解处理器@AutoService(Processor.class)public class MyAnnotationProcessor extends AbstractProcessor{Filer mFiler;Messager mMessager;@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);mMessager = processingEnv.getMessager();mFiler = processingEnv.getFiler();}@Overridepublic Set<String> getSupportedAnnotationTypes() {Set<String> annoation = new LinkedHashSet<>();annoation.add(MyAnnotation.class.getCanonicalName());return annoation;}@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {if (set == null || set.isEmpty()) {info(">>elements is null<<");return true;}Set<?extends Element> elements = roundEnv.getElementsAnnotatedWith(MyAnnotation.class);if (elements == null || elements.isEmpty()) {info(">>> elements is null... <<<");return true;}for (Element annotationElement:elements) {if (annotationElement.getKind() != ElementKind.CLASS) {error(annotationElement, "Only classes can be annotated with @%s", MyAnnotation.class.getSimpleName());return true;}analysisAnnoation(annotationElement);}return false;}private void analysisAnnoation(Element classElement) {MyAnnotation annotation = classElement.getAnnotation(MyAnnotation.class);String name = ();String newClassName = name;StringBuilder builder = new StringBuilder();builder.append("package com.xxxx.annotation;\n\n").append("public class ").append(newClassName).append("{\n\n").append("\tpublic String getMessage() {\n").append("\t\treturn \"").append(name).append("!\\n").append("\";\n").append("\t}\n").append("}\n");try {JavaFileObject source = mFiler.createSourceFile(newClassName);Writer write = source.openWriter();write.write(builder.toString());write.flush();write.close();} catch (IOException e) {e.printStackTrace();}}private void info(String msg, Object... args) {mMessager.printMessage(Diagnostic.Kind.NOTE, String.format(msg, args));}private void error(Element e, String msg, Object... args) {mMessager.printMessage(Diagnostic.Kind.ERROR, String.format(msg, args), e);}}@AutoService 注册⾃定义注解处理器gradle增加依赖apply plugin: 'java-library'dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.google.auto.service:auto-service:1.0-rc2'}sourceCompatibility = "1.7"targetCompatibility = "1.7"3. 使⽤配置gradleandroid {compileSdkVersion 27defaultConfig {applicationId "com.pax.annotationprocessor"minSdkVersion 22targetSdkVersion 27versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"javaCompileOptions {annotationProcessorOptions {includeCompileClasspath = true}}}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:27.1.1'implementation 'com.android.support.constraint:constraint-layout:1.1.2'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'implementation project(":compile")}增加注解@MyAnnotation(name = "MyAnn")public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);com.xxxx.annotation.MyAnn myAnn = new MyAnn();Log.i("TAG", myAnn.getMessage());}}运⾏app时报错如下:Failed to find byte code for javax/annotation/processing/AbstractProcessor 处理⽅法:File/Settings/Build/Instant Run。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android注解入门 并来自己写一个框架 介绍 这里我带大家来学习一下注解 并且用来写下一个模仿xUtils3 中View框架 此框架 可以省略activity或者fragment的 findViewById 或者设置点击事件的烦恼
如下代码: fragment package a.fmy.com.myapplication; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import a.fmy.com.mylibrary.FmyClickView; import a.fmy.com.mylibrary.FmyContentView; import a.fmy.com.mylibrary.FmyViewInject; import a.fmy.com.mylibrary.FmyViewView;
//你的fragment的布局id Your fragment's LayoutId @FmyContentView(R.layout.fragment_blank) public class BlankFragment extends Fragment { //你想实例化控件的id //Do you want to control instance id // 等价于 findViewByid //Equivalent to the findViewByid @FmyViewView(R.id.tv1) TextView tv1; @FmyViewView(R.id.tv2) TextView tv2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //初始化fragment Initialize Fragement return FmyViewInject.injectfragment(this,inflater,container); } //你想给哪个控件添加 添加事件 的id //Do you want to add add event id to which controls @FmyClickView({R.id.tv1,R.id.tv2}) public void myOnclick(View view){ switch (view.getId()) { case R.id.tv1: tv1.setText("TV1 "+Math.random()*100); break; case R.id.tv2: tv2.setText("TV2 "+Math.random()*100); break; default:
} } } Activity
package a.fmy.com.myapplication; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.widget.FrameLayout; import a.fmy.com.mylibrary.FmyContentView; import a.fmy.com.mylibrary.FmyViewInject; import a.fmy.com.mylibrary.FmyViewView;
@FmyContentView(R.layout.activity_main) public class MainActivity extends AppCompatActivity {
@FmyViewView(R.id.fl) FrameLayout fl;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //initActivity // 初始化activity FmyViewInject.inject(this); }
@Override protected void onResume() { super.onResume(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.fl,new BlankFragment()); fragmentTransaction.commit(); } } java注解学习 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。
元注解: 元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解: 1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited 这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target: @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方) 取值(ElementType)有: 1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
使用实例: 复制代码 @Target(ElementType.TYPE) public @interface Table { /** * 数据表名称注解,默认值为类名称 * @return */ public String tableName() default "className"; }
@Target(ElementType.FIELD) public @interface NoDBColumn {
} 复制代码 注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。
@Retention: @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有: 1.SOURCE:在源文件中有效(即源文件保留) 2.CLASS:在class文件中有效(即class保留) 3.RUNTIME:在运行时有效(即运行时保留)
Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:
复制代码 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; } 复制代码