当前位置: 首页 > news >正文

python做问卷调查的网站wap网站 微信登录

python做问卷调查的网站,wap网站 微信登录,百度小程序wordpress,建设童装网站的意义在java和android 中#xff0c;注解的运用非常广泛#xff0c;很多的类库#xff0c;第三方框架中都用到了注解。所以我们有必要来熟悉注解的相关知识。 Annotation#xff0c;注解#xff08;也称为元数据#xff09;#xff0c;可以为我们在代码中添加额外的信息… 在java和android 中注解的运用非常广泛很多的类库第三方框架中都用到了注解。所以我们有必要来熟悉注解的相关知识。 Annotation注解也称为元数据可以为我们在代码中添加额外的信息我们也可以很方便的使用这些数据 当然在代码中添加额外信息我们最经常使用的是注释comment,好的注释对于理解代码或逻辑是非常重要的comment通俗易懂并且使用一些工具注释也可以生成专门的文档但是注解相比注释拥有更加强大的不可替代的功能。它可以提供编译期的一些操作比如类型检查生成新的文件包括java文件等。 annotation是java5才引入的新特性它通过将信息和源代码结合在一起可以提供一些java语言本身无法的表达的额外信息。它的相关内容可以由编译器来测试或者验证当然运行时期也可以使用注解来提供额外信息。 注解的语法其实比较简单除了多个符号其他和java本身语法一样。java 5 在java.lang中内置了三种标准注解。android中内置的注解更多)。 Override: 表示当前方法其实是覆盖父类的方法如果有拼写错误等编译器和IDE就可以发出错误提示。Deprecated:表示该类或方法不建议使用了未来有可能被废弃或者被移除如果程序员使用了该类或方法那么编译器和IDE将会发出警告信息。 这里也就就是warning而已你也可以继续使用不过建议还是不要使用被Deprecated的API说不定未来哪个版本就被移除了。SuppressWarnings:给编译器一条指令告诉它对范围内的某些类型的警告保持静默。这样编译时就不再输出该警告了。 看一个简单的demo 从截图看到看到eclipse中对不同类型的annotation都做了相应的提示。 并且也可以看到同一个元素上也可以使用多个不同的注解。而SuppressWarnings注解接收的其实是一个数组例如demo当中的 unchecked表示是未检查的转换时的警告而fallthrough则表示在switch块中某个case没有使用break而直接流向了下一条case时的警告。从编码习惯上来讲你屏蔽了fallthrough的警告也可以告别其他人case没有使用break这是因为代码的逻辑而不是你忘记写了。 自定义注解 从以上demo就可以看出注解很有用也方便但是内置的注解不可能满足我们五花八门的需求所以此时就需要我们来自定义注解了。 java中内置了四种元注解meta-annotation元注解就是负责注解其他注解这句话好绕啊来帮助我们自定义注解的。 Target 表示该注解可以用在什么地方使用范围可能的ElementType参数包括: CONSTRUCTOR:构造器的声明。FIELD:域声明包含enum的实例。LOCAL_VARIABLE : 局部变量声明。METHOD : 方法声明。PACKAGE: 包声明。PARAMETER: 参数声明。TYPE 类接口包括注解类型或 enum类型。 Retention: 表示需要在什么级别保存该注解信息生命周期可选的RetentionPolicy参数包括 SOURCE:源码级别注解将被编译器丢弃。CLASS: 在编译器生成的class文件中可用但是会被VM丢弃。默认的就是该级别。RUNTIME: 运行期保留该注解所以此时可以通过反射机制来读取注解的信息。 Documented:将注解包含在javadoc中。 Inherited:允许子类继承父类的注解。 具体的关于如何定义自己的注解几行简单的代码胜过千言万语。 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface UseCase {public int id();public String description() default no description; } public class PasswordUtils {UseCase(id 47, description password must contain one number)public boolean validatePassword(String password){return true;}UseCase(id 48)public String encryptPassword(String password){return encryptPassword();}UseCase(id 49, description new password cant equal previously used ones)public boolean checkouForNewPassword(){return false;} } 通过代码可以看出定义一个注解和定义一个interface非常相似只不过多了一个符号罢了。在定义注解时使用了一些元注解比如Target或者 Retention它们分别用来表明注解的应用范围生命周期情况。 而从语法的角度来看注解的使用方法也和publicstatic或void等修饰符一样没什么大的差别。 而定义注解时可以看到定义体里面包含了一些比较特殊的方法。我们也称之为配置参数这些方法只能是public或者default访问权限方法的返回值就是配置参数的类型并且我们可以为其指定默认值我们在分析处理注解时程序或工具就可以利用这些值。 UseCase由UseCase.java定义并且其中包含了两个配置参数id和description并且它们都是有类型的配置参数可以使用的类型如下 所有的基本类型。int,float,boolean等。StringClassenumAnnotation以上类型的数组关于注解元素的问题我们还需要注意如下几个方面。 配置参数本身还可以是一个注解这就说明注解可以嵌套。配置参数不能有不确定的值也就是说配置参数要么在定义时有默认值要么在使用时提供相应的值。并且这个值还不能是null。所以这个是比较尴尬的地方因此比如String类型的元素我们不能赋值为null那么习惯用法就是使用 ;我们在使用注解时采用的是 键值对这种语法id 48有一个快捷方式就是注解中如果定义了名为value的配置参数那么在使用时如果该参数是唯一需要赋值的一个参数那么可以不使用键值对直接在括号内给出value的值就可以了。value可以是任何合法类型的参数)。注解可以嵌套但是不可以继承。而实际上当你使用来定义注解时默认继承的是java.lang.annotation.Annotation。而对于上面我们那个 UseCase的demo我们写一个程序来进行处理。 public class UseCaseTracker {public static void main(String[] args) {// TODO Auto-generated method stubListInteger useCases new ArrayListInteger();Collections.addAll(useCases, 47, 48, 49, 50);trackUseCases(useCases, PasswordUtils.class);}public static void trackUseCases(ListInteger useCases, Class? cl) {for (Method m : cl.getDeclaredMethods()){// getDeclaredAnnotation 返回指定类型的 注解对象 UseCase uc m.getDeclaredAnnotation(UseCase.class);if (uc ! null){System.out.println(Found UseCase : uc.id() \t uc.description());useCases.remove(new Integer(uc.id()));}}System.out.println(--------------------------------------);for (int i : useCases){System.out.println(Warning : Miss use case -- i);}} } 输出结果为 Found UseCase :47 password must contain one number Found UseCase :48 no description Found UseCase :49 new password cant equal previously used ones -------------------------------------- Warning : Miss use case --50 通过上面代码我们可以看出利用反射我们可以很好的处理注解这其实就像处理普通类那样。 注解的基本知识本身不复杂那么下面我们看一个复杂点的例子。在android常用的xutils3框架中包含了一个数据库模块这个数据库在使用时就是通过注解来创造表名或列名的那么下面我们也自定义一个注解通过注解来生成javaBean对象的创建数据库表的语句。 //告诉注解处理器需要生成一个数据库表 //这个注解只能用于类接口enum Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface DBTable {public String name() default ; } Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface Constraints {//这些元素都有默认值这样我们就不必强迫程序员必须赋值了boolean primaryKey() default false;boolean allowNull() default true;boolean unique() default false; } /*** author www.yaoxiaowen.com*/ Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface SQLString {//定义了元素名为value在符合条件时我们使用时可以直接在括号内输入value的值就ok了。int value() default 0;String name() default ;Constraints constraints() default Constraints; } /*** SQLInteger 和 SQLString一样都是要求在javabean上根据不同的数据类型使用不同的注解* author www.yaoxiaowen.com*/ Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface SQLInteger {String name() default ;//注解嵌套Constraints constraints() default Constraints; } /*** 我们的目的就是为该javabean生成一个创建表的语句* author www.yaoxiaowem.com*/ DBTable(name MEMBER) public class Member {SQLString(30)String firstName;SQLString(50)String lastName;SQLIntegerInteger age;SQLString(value 30,constraints Constraints(primaryKey true))String handle;static int memberCount;} public class TableCreator {public static void main(String[] args) throws Exception{StringBuilder createCommand new StringBuilder();String className test.annotation.database.Member;Class? cl Class.forName(className);DBTable dbTable cl.getAnnotation(DBTable.class);String tableName dbTable.name();//如果名字为空就使用类名if (tableName.length() 1){tableName cl.getName().toUpperCase();}createCommand.append(CREATE TABLE tableName ();ListString columnDefs new ArrayListString();for (Field field : cl.getDeclaredFields()){String columnName null;Annotation[] anns field.getDeclaredAnnotations();if (anns.length 1){continue;}//这里的写法之所以简单因为我们每个Field上面最多只有一个 注解if (anns[0] instanceof SQLInteger){SQLInteger sInt (SQLInteger)anns[0];//没有名字的话我们就使用Field的名字来做为 列名if (sInt.name().length() 1){columnName field.getName();}else {columnName sInt.name();}columnDefs.add(columnName INT getConstraints(sInt.constraints()));}if (anns[0] instanceof SQLString){SQLString sString (SQLString)anns[0];if (sString.name().length() 1){columnName field.getName();}else {columnName sString.name();}columnDefs.add(columnName VARCHAR( sString.value() ) getConstraints(sString.constraints()));}}for (String columnDef : columnDefs){createCommand.append(\n\t columnDef ,);}//移除最后的一个逗号String tableCreate createCommand.substring(0, createCommand.length()-1) );;System.out.println(TABLE Creation SQL for className is: \n tableCreate);}//解析出 Constraints 注解的内容private static String getConstraints(Constraints con){String constraints ;if (!con.allowNull()){constraints Not Null;}if (con.primaryKey()){constraints PRIMARY KEY ;}if (con.unique()){constraints NNIQUE ;}return constraints;} } 输出结果为 TABLE Creation SQL for test.annotation.database.Member is: CREATE TABLE MEMBER(firstName VARCHAR(30),lastName VARCHAR(50),age INT ,handle VARCHAR(30) PRIMARY KEY ); 这个demo虽然没有实际的意义但是仔细分析该demo对于我们理解注解还是比较有帮助的。 在java 5当中引入 annotation时java也引入了注解处理工具Annotation Processing Tool (apt)apt是一个可以在编译时使用的命令行工具但是它是Oracle提供的私有实现所以该工具在java 8中被移除了而在java6中通过 JSR 269 annotation processing facility来规范了自定义注解处理器的这一功能。也有了新的APIjavax.annotation.processing而关于这些内容我们下一个篇文章再进行介绍。 作者 www.yaoxiaowen.com github https://github.com/yaowen369 欢迎对于本人的博客内容批评指点如果问题可评论或邮件(yaowen369gmail.com)联系 欢迎转载转载请注明出处.谢谢 转载于:https://www.cnblogs.com/yaoxiaowen/p/6750192.html
http://www.zqtcl.cn/news/248476/

相关文章:

  • 网站建设及推广服务的合同范本留言网站建设的报告
  • 工程师招聘网站做网站需要公司资质吗
  • 苏州模板网站建站开网店如何运营和推广
  • 换空间网站备案北京网页设计平台
  • 德德模板网站建设步骤可信的品牌网站建设
  • 网站权重0免费好用的ip代理
  • 赣州建设网站公司敬请期待英文怎么写
  • 可以做多边形背景的网站深圳网站建设 套餐
  • 建设工程的招标网站有哪些长江证券官方网站下载
  • 鹤壁网站建设智能网站建设步骤
  • 建设工程规划许可证在哪个网站查询手机免费推广软件
  • 微信上的网站怎么做的吗网页设计结果分析怎么写
  • 网站电子备案哪个网站做网销更好
  • 做电子商务网站需要什么软件西北舜天建设有限公司网站
  • 怎么做门淘宝网站建筑模板厂
  • 纯静态网站开发做面食的网站
  • 网站海外推广服务wordpress 分类编号
  • 按月网站建设wordpress关闭主题
  • 网站建设设计官网网站为什么做优化ppt
  • 搭配网站开发的开题报告linux服务器做网站
  • 如何做公司网站点击率高电商网站哪家做的好
  • 网站提供什么服务少儿英语做游戏网站推荐
  • 用jsp做网站的体会在哪个网站做一照一码
  • 元典科技网站建设可视化网站制作
  • 网站首页尺寸做电影下载网站赚钱
  • 福州企业网站开发宁德市医院东侨院区
  • 昭通公司做网站ps在线网页版
  • 做阿里巴巴网站费用吗深圳市企业名录
  • 做仿牌网站被封动态公司网站设计
  • 怎么用flashfxp上传网站ui设计需要学哪些课程