搜档网
当前位置:搜档网 › annotation入门_

annotation入门_

annotation入门_
annotation入门_

Java Annotation 入门
摘要: 本文针对 java 初学者或者 annotation 初次使用者全面地说明了 annotation 的使用方法、定义 方式、分类。初学者可以通过以上的说明制作简单的 annotation 程序,但是对于一些高级的 an notation 应用(例如使用自定义 annotation 生成 javabean 映射 xml 文件)还需要进一步的研 究和探讨。涉及到深入 annotation 的内容,作者将在后文《Java Annotation 高级应用》中谈 到。
同时,annotation 运行存在两种方式:运行时、编译时。上文中讨论的都是在运行时的 annota tion 应用,但在编译时的 annotation 应用还没有涉及,
一、为什么使用 Annotation:
在 JAVA 应用中,我们常遇到一些需要使用模版代码。例如,为了编写一个 JAX-RPC web serv ice,我们必须提供一对接口和实现作为模版代码。如果使用 annotation 对远程访问的方法代码 进行修饰的话,这个模版就能够使用工具自动生成。 另外,一些 API 需要使用与程序代码同时维护的附属文件。例如,JavaBeans 需要一个 BeanIn fo Class 与一个 Bean 同时使用/维护,而 EJB 则同样需要一个部署描述符。此时在程序中使用 a nnotation 来维护这些附属文件的信息将十分便利而且减少了错误。
二、Annotation 工作方式:
在 5.0 版之前的 Java 平台已经具有了一些 ad hoc annotation 机制。比如,使用 transient 修 饰符来标识一个成员变量在序列化子系统中应被忽略。而@deprecated 这个 javadoc tag 也是 一个 ad hoc annotation 用来说明一个方法已过时。从 Java5.0 版发布以来,5.0 平台提供了 一个正式的 annotation 功能:允许开发者定义、使用自己的 annoatation 类型。此功能由一个 定义 annotation 类型的语法和一个描述 annotation 声明的语法,读取 annotaion 的 API,一 个使用 annotation 修饰的 class 文件,一个 annotation 处理工具(apt)组成。
1

annotation 并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它 会反过来对正在运行的程序语义有所影响。annotation 可以从源文件、class 文件或者以在运行 时反射的多种方式被读取。 当然 annotation 在某种程度上使 javadoc tag 更加完整。一般情况下,如果这个标记对 java 文档产生影响或者用于生成 java 文档的话,它应该作为一个 javadoc tag;否则将作为一个 an notation。
三、Annotation 使用方法:
1。 类型声明方式 : 。 通常,应用程序并不是必须定义 annotation 类型,但是定义 annotation 类型并非难事。Annot ation 类型声明于一般的接口声明极为类似, 区别只在于它在 interface 关键字前面使用“@”符号。 annotation 类型的每个方法声明定义了一个 annotation 类型成员,但方法声明不必有参数或者 异常声明;方法返回值的类型被限制在以下的范围:primitives、String、Class、enums、an notation 和前面类型的数组;方法可以有默认值。
下面是一个简单的 annotation 类型声明: 清单 1:
/** * Describes the Request-For-Enhancement(RFE) that led * to the presence of the annotated API element. */ public @interface RequestForEnhancement { int id();
String synopsis(); String engineer() default "[unassigned]"; String date(); } default "[unimplemented]";
2

代码中只定义了一个 annotation 类型 RequestForEnhancement。
2。 修饰方法的 annotation 声明方式 : 。 annotation 是一种修饰符,能够如其它修饰符(如 public、static、final)一般使用。习惯用法 是 annotaions 用在其它的修饰符前面。 annotations 由“@+annotation 类型+带有括号的成员 -值列表”组成。这些成员的值必须是编译时常量(即在运行时不变) 。
A:下面是一个使用了 RequestForEnhancement annotation 的方法声明: 清单 2:
@RequestForEnhancement( id = 2868724,
synopsis = "Enable time-travel", engineer = "Mr. Peabody", date ) public static void travelThroughTime(Date destination) { ... } = "4/1/3007"
B:当声明一个没有成员的 annotation 类型声明时,可使用以下方式: 清单 3:
/** * Indicates that the specification of the annotated API element * is preliminary and subject to change. */ public @interface Preliminary { }
3

作为上面没有成员的 annotation 类型声明的简写方式: 清单 4:
@Preliminary public class TimeTravel { ... }
C:如果在 annotations 中只有唯一一个成员,则该成员应命名为 value: 清单 5:
/** * Associates a copyright notice with the annotated API element. */ public @interface Copyright { String value(); }
更为方便的是对于具有唯一成员且成员名为 value 的 annotation(如上文) ,在其使用时可以忽 略掉成员名和赋值号(=) :
清单 6:
@Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster { ... }
4

3。 一个使用实例 : 。 结合上面所讲的,我们在这里建立一个简单的基于 annotation 测试框架。首先我们需要一个 an notation 类型来表示某个方法是一个应该被测试工具运行的测试方法。
清单 7:
import https://www.sodocs.net/doc/0f7057460.html,ng.annotation.*;
/** * Indicates that the annotated method is a test method. * This annotation should be used only on parameterless static methods. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { }
值得注意的是 annotaion 类型声明是可以标注自己的,这样的 annotation 被称为“meta-annot ations” 。
在上面的代码中,@Retention(RetentionPolicy.RUNTIME)这个 meta-annotation 表示了此 类型的 annotation 将被虚拟机保留使其能够在运行时通过反射被读取。而@Target(ElementTy pe.METHOD)表示此类型的 annotation 只能用于修饰方法声明。
下面是一个简单的程序,其中部分方法被上面的 annotation 所标注:
5

清单 8:
public class Foo { @Test public static void m1() { } public static void m2() { } @Test public static void m3() { throw new RuntimeException("Boom"); } public static void m4() { } @Test public static void m5() { } public static void m6() { } @Test public static void m7() { throw new RuntimeException("Crash"); } public static void m8() { } }
Here is the testing tool:
import https://www.sodocs.net/doc/0f7057460.html,ng.reflect.*;
public class RunTests { public static void main(String[] args) throws Exception { int passed = 0, failed = 0; for (Method m : Class.forName(args[0]).getMethods()) { if (m.isAnnotationPresent(Test.class)) { try { m.invoke(null); passed++;
6

} catch (Throwable ex) { System.out.printf("Test %s failed: %s %n", m, ex.getCause()); failed++; } } } System.out.printf("Passed: %d, Failed %d%n", passed, failed); } }
这个程序从命令行参数中取出类名,并且遍历此类的所有方法,尝试调用其中被上面的测试 anno tation 类型标注过的方法。在此过程中为了找出哪些方法被 annotation 类型标注过,需要使用 反射的 方式 执行此 查询 。如 果在调 用方 法时抛 出异 常, 此方法 被认 为已经 失败 ,并 打印一 个失 败 报告。最后,打印运行通过/失败的方法数量。 下面文字表示了如何运行这个基于 annotation 的测试工具:
清单 9:
$ java RunTests Foo Test public static void Foo.m3() failed: https://www.sodocs.net/doc/0f7057460.html,ng.RuntimeException: Boom Test public static void Foo.m7() failed: https://www.sodocs.net/doc/0f7057460.html,ng.RuntimeException: Crash Passed: 2, Failed 2
7

四、Annotation 分类: 根据 annotation 的使用方法和用途主要分为以下几类:
1。 内建 Annotation——Java5.0 版 在 java 语法中经常用到的内建 Annotation: 。 : @Deprecated 用于修饰已经过时的方法; @Override 用于修饰此方法覆盖了父类的方法(而非重载) ; @SuppressWarnings 用于通知 java 编译器禁止特定的编译警告。
下面代码展示了内建 Annotation 类型的用法: 清单 10:
package com.bjinfotech.practice.annotation;
/** * 演示如何使用 java5 内建的 annotation * 参考资料: * https://www.sodocs.net/doc/0f7057460.html,/docs/books/tutorial/java/javaOO/annotations.html * https://www.sodocs.net/doc/0f7057460.html,/j2se/1.5.0/docs/guide/language/annotations.html * https://www.sodocs.net/doc/0f7057460.html,/jgloss/annotations.html * @author cleverpig * */ import java.util.List;
public class UsingBuiltInAnnotation { //食物类 class Food{} //干草类 class Hay extends Food{}
8

//动物类 class Animal{ Food getFood(){ return null; } //使用 Annotation 声明 Deprecated 方法 @Deprecated void deprecatedMethod(){ } } //马类-继承动物类 class Horse extends Animal{ //使用 Annotation 声明覆盖方法 @Override Hay getFood(){ return new Hay(); } //使用 Annotation 声明禁止警告 @SuppressWarnings({"deprecation","unchecked"}) void callDeprecatedMethod(List horseGroup){ Animal an=new Animal(); an.deprecatedMethod(); horseGroup.add(an); } } }
9

2。 开发者自定义 Annotation: 由开发者自定义 Annotation 类型 。 。 : 下面是一个使用 annotation 进行方法测试的 sample:
AnnotationDefineForTestFunction 类型定义如下:
清单 11:
package com.bjinfotech.practice.annotation;
import https://www.sodocs.net/doc/0f7057460.html,ng.annotation.*; /** * 定义 annotation * @author cleverpig * */ //加载在 VM 中,在运行时进行映射 @Retention(RetentionPolicy.RUNTIME) //限定此 annotation 只能标示方法 @Target(ElementType.METHOD) public @interface AnnotationDefineForTestFunction{}
10

测试 annotation 的代码如下: 清单 12:
package com.bjinfotech.practice.annotation;
import https://www.sodocs.net/doc/0f7057460.html,ng.reflect.*;
/** * 一个实例程序应用前面定义的 Annotation:AnnotationDefineForTestFunction * @author cleverpig * */ public class UsingAnnotation { @AnnotationDefineForTestFunction public static void method01(){}
public static void method02(){}
@AnnotationDefineForTestFunction public static void method03(){ throw new RuntimeException("method03"); }
public static void method04(){ throw new RuntimeException("method04"); }
public static void main(String[] argv) throws Exception{ int passed = 0, failed = 0; //被检测的类名
11

String className="https://www.sodocs.net/doc/0f7057460.html,ingAnnotation"; //逐个检查此类的方法,当其方法使用 annotation 声明时调用此方法 for (Method m : Class.forName(className).getMethods()) { if (m.isAnnotationPresent(AnnotationDefineForTestFunction.class)) { try { m.invoke(null); passed++; } catch (Throwable ex) { System.out.printf("测试 %s 失败: %s %n", m, ex.getCause()); failed++; } } } System.out.printf("测试结果: 通过: %d, 失败: %d%n", passed, failed); } }
3。 使用第三方开发的 Annotation 类型 。 这 也 是 开 发 人 员 所 常 常 用 到 的 一 种 方 式 。 比 如 我 们 在 使 用 Hibernate3.0 时 就 可 以 利 用 Annotation 生成数据表映射配置文件,而不必使用 Xdoclet。 五、总结: 1。前面的文字说明了 annotation 的使用方法、定义方式、分类。初学者可以通过以上的说明制 作简单的 annotation 程序, 但是对于一些高级的 annotation 应用 (例如使用自定义 annotation 生成 javabean 映射 xml 文件)还需要进一步的研究和探讨。 2 。 同 时 , annotation 运 行 存 在 两 种 方 式 : 运 行 时 、 编 译 时 。 上 文 中 讨 论 的 都 是 在 运 行 时 的 annotation 应用,但在编译时的 annotation 应用还没有涉及,因为编译时的 annotation 要使 用 annotation processing tool。 涉及以上 2 方面的深入内容,作者将在后文《Java Annotation 高级应用》中谈到。
12

Java注解

注解 可以先把注解当成注释来看,注释就是给类的各个组成部分(包、类名、构造器、属性、方法、方法参数,以及局部变量)添加一些解释。 可以先不去管注解是用来干什么的,就把它当成注释来看。注解的格式当然不能与注释相同,注解是需要声明的,声明注解与声明一个接口有些相似。当然Java也有一些内置注解,例如:@Override就是内置注解。 1声明注解 声明注解与声明一个接口相似,它需要使用@interface。一个注解默认为Annotation的 注解还可以带有成员,没有成员的注解叫做标记注解。成员的类型只能是基本类型、枚举类型)、String、基本类型数组、String[],以及注解和注解数组类型。 其中String表示成员的类型,value()表示成员名称。其中圆括号不能没有,也不能在圆

括号内放参数,它不是一个方法,只是一个成员变量。 注解可以有多个成员,但如果只有一个成员,那么成员名必须为value。这时在设置成

Java还提供了一些元注解,用来控制注解,例如@Retention和@Target: ●@Target:ElementType类型(枚举类型),表示当前注解可以标记什么东西,可选 值为: TYPE:可以标记类、接口、注解类、Enum。 FIELD:可以标记属性。 METHOD:可以标记就去。 PARAMETER:可以标记参数。 CONSTRUCTOR:可以标记构造器。 LOCAL_VARIABLE:可以标记局部变量。 ANNOTATION_TYPE:可以标记注解类声明。

PACKAGE:可以标记包。 ●@Retention:RetentionPolicy类型(枚举类型),表示注解的可保留期限。可选值为: SOURCE:只在源代码中存在,编译后的字节码文件中不保留注解信息。 CLASS:保留到字节码文件中,但类加载器不会加载注解信息到JVM。 RUNTIME:保留到字节码文件中,并在目标类被类加载器加载时,同时加载注解信息到JVM,可以通过反射来获取注解信息。 2访问注解 很多第三方程序或工具都使用了注解完成特殊的任务,例如Spring、Struts等。它们都提供了自己的注解类库。在程序运行时使用反射来获取注解信息。下面我们来使用反射来获取注解信息。

annotation入门_

Java Annotation 入门
摘要: 本文针对 java 初学者或者 annotation 初次使用者全面地说明了 annotation 的使用方法、定义 方式、分类。初学者可以通过以上的说明制作简单的 annotation 程序,但是对于一些高级的 an notation 应用(例如使用自定义 annotation 生成 javabean 映射 xml 文件)还需要进一步的研 究和探讨。涉及到深入 annotation 的内容,作者将在后文《Java Annotation 高级应用》中谈 到。
同时,annotation 运行存在两种方式:运行时、编译时。上文中讨论的都是在运行时的 annota tion 应用,但在编译时的 annotation 应用还没有涉及,
一、为什么使用 Annotation:
在 JAVA 应用中,我们常遇到一些需要使用模版代码。例如,为了编写一个 JAX-RPC web serv ice,我们必须提供一对接口和实现作为模版代码。如果使用 annotation 对远程访问的方法代码 进行修饰的话,这个模版就能够使用工具自动生成。 另外,一些 API 需要使用与程序代码同时维护的附属文件。例如,JavaBeans 需要一个 BeanIn fo Class 与一个 Bean 同时使用/维护,而 EJB 则同样需要一个部署描述符。此时在程序中使用 a nnotation 来维护这些附属文件的信息将十分便利而且减少了错误。
二、Annotation 工作方式:
在 5.0 版之前的 Java 平台已经具有了一些 ad hoc annotation 机制。比如,使用 transient 修 饰符来标识一个成员变量在序列化子系统中应被忽略。而@deprecated 这个 javadoc tag 也是 一个 ad hoc annotation 用来说明一个方法已过时。从 Java5.0 版发布以来,5.0 平台提供了 一个正式的 annotation 功能:允许开发者定义、使用自己的 annoatation 类型。此功能由一个 定义 annotation 类型的语法和一个描述 annotation 声明的语法,读取 annotaion 的 API,一 个使用 annotation 修饰的 class 文件,一个 annotation 处理工具(apt)组成。
1

出师表原文及注释

出师表 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、棉、允之任也。 愿陛下托臣以讨贼兴复之效,不效则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。

shiro入门教程

一、介绍: shiro是apache提供的强大而灵活的开源安全框架,它主要用来处理身份认证,授权,企业会话管理和加密。 shiro功能:用户验证、用户执行访问权限控制、在任何环境下使用session API,如cs程序。可以使用多数据源如同时使用oracle、mysql。单点登录(sso)支持。remember me服务。详细介绍还请看官网的使用手册:https://www.sodocs.net/doc/0f7057460.html,/reference.html 与spring security区别,个人觉得二者的主要区别是: 1、shiro灵活性强,易学易扩展。同时,不仅可以在web中使用,可以工作在任务环境内中。 2、acegi灵活性较差,比较难懂,同时与spring整合性好。 如果对权限要求比较高的项目,个人建议使用shiro,主要原因是可以很容易按业务需求进行扩展。 附件是对与shiro集成的jar整合及源码。 二、shiro与spring集成 shiro默认的配置,主要是加载ini文件进行初始化工作,具体配置,还请看官网的使用手册(https://www.sodocs.net/doc/0f7057460.html,/web.html)init文件不支持与spring的集成。此处主要是如何与spring及springmvc集成。 1、web.xml中配置shiro过滤器,web.xml中的配置类使用了spring的过滤代理类来完成。 Xml代码 2、在spring中的application.xml文件中添加shiro配置:

Java代码

anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro.web.filter.authc.FormAuthenticatio nFilter authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenti cationFilter logout org.apache.shiro.web.filter.authc.LogoutFilter noSessionCrea tion org.apache.shiro.web.filter.session.NoSessionCreati onFilter perms org.apache.shiro.web.filter.authz.PermissionsAuthor izationFilter port org.apache.shiro.web.filter.authz.PortFilter rest org.apache.shiro.web.filter.authz.HttpMethodPermiss ionFilter roles org.apache.shiro.web.filter.authz.RolesAuthorizatio nFilter ssl org.apache.shiro.web.filter.authz.SslFilter user https://www.sodocs.net/doc/0f7057460.html,erFilter

【注释.】人教版九年级上语文《出师表》诸葛亮--原文及其注释

《出师表》诸葛亮 先帝创业未半而中道崩殂(cú),今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞(sè)忠谏之路也。 宫中府中,俱为一体,陟(zhì )罚臧(zāng)否(pǐ),不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中、侍郎郭攸(yōu)之、费祎(yī)、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗(wèi)陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨(bì)补阙(quē)漏,有所广益。 将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行(háng)阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓(huán)、灵也。侍中、尚书、长(zhǎng)史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥(wěi)自枉屈,三顾臣于草庐之中,咨臣以

当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙(sù)夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽(nú)钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹(zōu)善道,察纳雅言。深追先帝遗诏,臣不胜受恩感激。 今当远离,临表涕零,不知所言。 《出师表》注释: (1)先帝:指刘备。因刘备此时已死,故称先帝。创:开创,创立。业:统一中国的大业。未半:没有完成一半。(未:没有) (2)中道:犹言半路。崩殂(cú):死。崩,古时指皇帝死亡。殂,死亡。

RESTEasy入门经典

RESTEasy是JBoss的开源项目之一,是一个RESTful Web Services框架。RESTEasy的开发者Bill Burke同时也是JAX-RS的J2EE标准制定者之一。JAX-RS 是一个JCP制订的新标准,用于规范基于HTTP的RESTful Web Services的API。 我们已经有SOAP了,为什么需要Restful WebServices?用Bill自己的话来说:"如果是为了构建SOA应用,从技术选型的角度来讲,我相信REST比SOAP更具优势。开发人员会意识到使用传统方式有进行SOA架构有多复杂,更不用提使用这些做出来的接口了。这时他们就会发现Restful Web Services的光明之处。" 说了这么多,我们使用RESTEasy做一个项目玩玩看。首先创造一个maven1的web 项目 Java代码 1.mvn archetype:create -DgroupId=org.bluedash \ 2. 3.-DartifactId=try-resteasy -DarchetypeArtifactId=maven-archetype -webapp 准备工作完成后,我们就可以开始写代码了,假设我们要撰写一个处理客户信息的Web Service,它包含两个功能:一是添加用户信息;二是通过用户Id,获取某个用户的信息,而交互的方式是标准的WebService形式,数据交换格式为XML。假设一条用户包含两个属性:Id和用户名。那么我们设计交换的XML数据如下: Java代码 1. 2. 1 3. liweinan 4. 首先要做的就是把上述格式转换成XSD2,网上有在线工具可以帮助我们完成这一工作3,在此不详细展开。使用工具转换后,生成如下xsd文件: Java代码 1. 2. 4.

关系映射annotation

一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上 添加唯一约束)。 1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; private Heart heart; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @OneToOne @PrimaryKeyJoinColumn public Heart getHeart() { return heart; }

public void setHeart(Heart heart) { this.heart = heart; } } @Entity @Table(name="Test_Heart") public class Heart { private Integer id; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 通过@PrimaryKeyJoinColumn批注定义了一对一关联 2.使用外键进行实体一对一关联: @Entity @Table(name="Test_Trousers") public class Trousers { @Id public Integer id;

出师表原文及英文对照版

《出师表》原文及英文对照版 ·臣亮言:先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。 Permit me to observe: the late emperor was taken from us before he could finish his life's work, the restoration of the Han. Today, the empire is still divided in three, and our very survival is threatened. ·然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。 Yet still the officials at court and the soldiers throughout the realm remain loyal to you, your majesty. Because they remember the late emperor, all of them, and they wish to repay his kindness in service to you. ·诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 This is the moment to extend your divine influence, to honor the memory of the late Emperor and strengthen the morale of your officers. It is not the time to listen to bad advice, or close your ears to the suggestions of loyal men. ·亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。 The emperors of the Western Han chose their courtiers wisely, and their dynasty flourished. The emperors of the Eastern Han chose poorly, and they doomed the empire to ruin. ·先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。 Whenever the late Emperor discussed this problem with me, he lamented the failings of Emperors Huan and Ling.

java中注解的几大作用

@SuppressWarnings("deprecation")//阻止警告 @HelloAnnotation("当为value属性时,可以省掉属性名和等于号。") public static void main(String[]args)throws Exception{ System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(HelloAnnotation.class)){ HelloAnnotation helloAnnotation= (HelloAnnotation)AnnotationTest.class.getAnnotation(HelloAnnotation.class); System.out.println("color():"+helloAnnotation.color()); System.out.println("value():"+helloAnnotation.value()); System.out.println("author():"+helloAnnotation.author()); System.out.println("arrayAttr():"+helloAnnotation.arrayAttr().length); System.out.println("annotationAttr():"+helloAnnotation.annotationAttr().value()); System.out.println("classType(): "+helloAnnotation.classType().newInstance().sayHello("hello,ketty")); } } @Deprecated//自定义:备注过时的方法信息 public static void sayHello(){ System.out.println("hello,world"); } }

ERDAS IMAGINE快速入门

实验一ERDAS IMAGINE快速入门 一、背景知识 ERDAS IMAGINE是美国ERDAS公司开发的遥感图像处理系统,后来被Leica公司合并。它以其先进的图像处理技术,友好、灵活的用户界面和操作方式,面向广阔应用领域的产品模块,服务于不同层次用户的模型开发工具以及高度的RS/GIS(遥感图像处理和地理信息系统)集成功能,为遥感及相关应用领域的用户提供了内容丰富而功能强大的图像处理工具,代表了遥感图像处理系统未来的发展趋势。 ERDAS IMAGINE是以模块化的方式提供给用户的,可使用户根据自己的应用要求、资金情况合理地选择不同功能模块及其不同组合,对系统进行剪裁,充分利用软硬件资源,并最大限度地满足用户的专业应用要求,目前的最高版本为9.1。ERDAS IMAGINE面向不同需求的用户,对于系统的扩展功能采用开放的体系结构以IMAGINE Essentials、IMAGINE Advantage、IMAGINE Professional的形式为用户提供了低、中、高三档产品架构,并有丰富的功能扩展模块供用户选择,使产品模块的组合具有极大的灵活性。 ?IMAGINE Essentials级:是一个花费极少的,包括有制图和可视化核心功能的影像工具软件。该级功能的重点在于遥感图像的输入、输出与显示;图像库的 建立与查询管理;专题制图;简单几何纠正与非监督分类等。 ?IMAGINE Advantage级:是建立在IMAGINE Essential级基础之上的,增加了更丰富的图像光栅GIS和单片航片正射校正等强大功能的软件。IMAGINE Advantag提供了灵活可靠的用于光栅分析,正射校正,地形编辑及先进的影像 镶嵌工具。简而言之,IMAGINE Advantage是一个完整的图像地理信息系统 (Imaging GIS)。 ?IMAGINE Professional级:是面向从事复杂分析,需要最新和最全面处理工具,

前出师表原文、注释及翻译

前出师表 先帝创业未半而中道崩殂[cú],今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟[zhì]罚臧[zāng]否[pǐ],不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中侍郎郭彼之、费、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗[wèi]陛下。愚以为官中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。 将军向宠,性行[xíng]淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行[h áng]阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥[wěi]自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡沪,深入不毛。今南方已定,兵

甲已足,当奖率三军,北定中原,庶竭驽[nú]钝,攘[rǎng]除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、韦、允之任也。 愿陛下托臣以讨贼兴复之效,不效则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、韦、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹[zōu]善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。 今当远离,临表涕零,不知所言。 《前出师表》译文 先帝创立帝业还没有完成一半,就中途去世了。现在,天下已分成魏、蜀、吴三国,我们蜀国人力疲惫,物力又很缺乏,这确实是国家危急存亡的关键时刻。然而,侍卫大臣们在宫廷内毫不懈怠,忠诚有志的将士在疆场上舍身作战,这都是因为追念先帝在世时对他们的特殊待遇,想报效给陛下啊。陛下确实应该广泛地听取群臣的意见,发扬光大先帝留下的美德,弘扬志士们的气概;不应该随随便便地看轻自己,言谈中称引譬喻不合大义(说话不恰当),以致堵塞忠臣进谏劝告的道路。 宫里身边的近臣和丞相府统领的官吏,本都是一个整体,升赏惩罚,扬善除恶,不应标准不同。如果有营私舞弊、违犯法律和尽忠行害的人,陛下应交给主管的官吏,由他们评定应得的处罚或奖赏,用来表明陛下公正严明的治理方针。不应偏袒徇私,使得宫内和宫外有

一小时搞明白注解处理器(Annotation Processor Tool)

一小时搞明白注解处理器(Annotation Processor Tool) 什么是注解处理器? 注解处理器是(Annotation Processor)是javac的一个工具,用来在编译时扫描和编译和处理注解(Annotation)。你可以自己定义注解和注解处理器去搞一些事情。一个注解处理器它以Java代码或者(编译过的字节码)作为输入,生成文件(通常是java文件)。这些生成的java文件不能修改,并且会同其手动编写的java代码一样会被javac编译。看到这里加上之前理解,应该明白大概的过程了,就是把标记了注解的类,变量等作为输入内容,经过注解处理器处理,生成想要生成的java代码。 处理器AbstractProcessor 处理器的写法有固定的套路,继承AbstractProcessor。如下: [java] view plain copy 在CODE上查看代码片派生到我的代码片 public class MyProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); } @Override public Set getSupportedAnnotationTypes() { return null; } @Override public SourceVersion getSupportedSourceVersion() { return https://www.sodocs.net/doc/0f7057460.html,testSupported(); } @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { return true; } } init(ProcessingEnvironment processingEnv) 被注解处理工具调用,参数ProcessingEnvironment 提供了Element,Filer,Messager等工具 getSupportedAnnotationTypes() 指定注解处理器是注册给那一个注解的,它是一个字符串的集合,意味着可以支持多个类型的注解,并且字符串是合法全名。getSupportedSourceVersion 指定Java版本 process(Set annotations, RoundEnvironment roundEnv) 这个也是最主

二次开发入门MapBasic--MapInfo教程

MapInfo教程--二次开发入门摘要:MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。 一、利用MapBasic开发 MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。 二、利用OLE自动化开发 1. 建立Mapinfo自动化对象 基于OLE自动化的开发就是编程人员通过标准化编程工具如VC、VB、Delphi、PB等建立自动化控制器,然后通过传送类似MapBasic语言的宏命令对Mapinfo进行操作。实际上是将Mapinfo用作进程外服务器,它在后台输出OLE自动化对象,供控制器调用它的属性和方法。 OLE自动化开发的首要一步就是建立Mapinfo自动化对象,以Delphi为例(后面都是如此),你可设定一个Variant类型的全程变量代表OLE自动化对象,假设该变量名为olemapinfo,那么有: oleMapinfo := CreateOleObject('Mapinfo.Application') 一旦OLE自动化对象建立,也就是后台Mapinfo成功启动,你就可以使用该对象的Do方法向Mapinfo发送命令,如: oleMapinfo.Do('Set Next Document Parent' + WinHand + 'Style 1') 这一命令使Mapinfo窗口成为应用程序的子窗口,WinHand是地图窗口句柄,style 1 是没有边框的窗口类型。你还可以使用自动化对象的Eval方法返回MapBasic表达式的值,如下面语句返回当前所打开的表数: TablesNum:=olemapinfo.eval('NumTables()') 你也可以直接调用Mapinfo菜单或按钮命令对地图窗口进行操作,如地图放大显示:oleMapinfo.RunMenuCommand(1705) 2. 建立客户自动化对象触发CallBack 基于OLE自动化开发的难点在于所谓的CallBack,Mapinfo服务器对客户程序地图窗口的反应叫CallBack,假如你在地图窗口中移动地图目标,Mapinfo能返回信息告诉你地图目标当前的坐标位置,这就是CallBack功能。如果你想定制自己的地图操作工具或菜单命令,你必须依靠CallBack。但是想捕获CallBack信息,你的客户程序必须具备接收CallBack信息的能力,为此需要在客户程序中定义自己的OLE自动化对象,如: //定义界面 IMyCallback = interface(IDispatch) ['{2F4E1FA1-6BC7-11D4-9632-913682D1E638}'] function WindowContentsChanged(var WindowID: Integer):SCODE;safecall; function SetStatusText(var StatusText: WideString): SCODE; safecall; //定义界面实现

人教版《出师表》原文及课下注释

出师表1 先帝2创业未半而中道崩殂3,今天下三分,益州4疲弊,此诚危急存亡之秋5也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇6,欲报之于陛下也。诚宜开张圣听7,以光8先帝遗德,恢弘9志士之气,不宜妄自菲薄,引喻失义10,以塞忠谏之路也。 宫中11府中12,俱为一体,陟罚臧否,不宜异同13。若有作奸犯科14及为忠善者,宜付有司论其刑赏15,以昭陛下平明之理16,不宜偏私,使内外异法17也。 侍中、侍郎郭攸之、费祎、董允18等,此皆良实,志虑忠纯19,是以先帝简拔20以遗21陛下。愚以为宫中之事,事无大小,悉以咨之22,然后施行,必能裨补阙漏23,有所广益。 将军向宠,性行淑均24,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督25。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所26。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵27也。侍中、尚书、长史、参军28,此悉贞良死节之臣29,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳30,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙31,猥32自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰33。后值倾覆34,

受任于败军之际,奉命于危难之间,尔来35二十有一年矣。 先帝知臣谨慎,故临崩寄臣以大事36也。受命以来,夙夜忧叹37,恐托付不效,以伤先帝之明,故五月渡泸38,深入不毛39。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝40,攘除41奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益42,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢43,以彰其咎44;陛下亦宜自谋,以咨诹善道45,察纳雅言46。深追先帝遗诏47,臣不胜受恩感激。 今当远离,临表涕零,不知所言。 1选自《汉魏六朝百三名家集·诸葛丞相集》(江苏广陵古籍刊印社1990年版)。表,古代向帝王上书陈情言事的一种文体。 2先帝:指刘备。 3崩殂(cú):死。崩,古时指皇帝死亡。殂,死亡。 4益州:这里指蜀汉。 5秋:这里是“时”的意思。 6殊遇:优待,厚遇。 7开张圣听:扩大圣明的听闻。意思是要后主广泛听取别人的意见。 8光:发扬光大。 9恢弘:这里是动词,意思是发扬扩大。也做“恢宏”。 10引喻失义:讲话不恰当。引喻,称引、譬喻。义,适宜、恰当。 11宫中:指皇宫中。 12府中:指朝廷中。

java注解详解

注解(Annotation)简介 Annotation(注解)是JDK5.0及以后版本引入的一个特性。注解是java的一个新的类型(与接口很相似),它与类、接口、枚举是在同一个层次,它们都称作为java的一个类型(TYPE)。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它的作用非常的多,例如:进行编译检查、生成说明文档、代码分析等。 JDK提供的几个基本注解 a.@SuppressWarnings 该注解的作用是阻止编译器发出某些警告信息。 它可以有以下参数: deprecation:过时的类或方法警告。 unchecked:执行了未检查的转换时警告。 fallthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。 path:在类路径、源文件路径等中有不存在的路径时的警告。 serial:当在可序列化的类上缺少serialVersionUID定义时的警告。 finally:任何finally子句不能完成时的警告。 all:关于以上所有情况的警告。 b.@Deprecated 该注解的作用是标记某个过时的类或方法。 c.@Override 该注解用在方法前面,用来标识该方法是重写父类的某个方法。 元注解 a.@Retention 它是被定义在一个注解类的前面,用来说明该注解的生命周期。 它有以下参数: RetentionPolicy.SOURCE:指定注解只保留在一个源文件当中。 RetentionPolicy.CLASS:指定注解只保留在一个class文件中。 RetentionPolicy.RUNTIME:指定注解可以保留在程序运行期间。 b.@Target 它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前。 它有以下参数: ElementType.TYPE:说明该注解只能被声明在一个类前。 ElementType.FIELD:说明该注解只能被声明在一个类的字段前。 ElementType.METHOD:说明该注解只能被声明在一个类的方法前。 ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。

Maya从入门到精通经典讲解

Maya绝技83式从入门到精通 第1招、自制MAY A启动界面 在安装目录下的BIN文件夹中的MayaRes.dll文件,用Resource Hacker打开。在软件的目录树中找到“位图”下MAY ASTARTUPIMAGE.XPM并保存。图片分辨率要一致,然后选择替换位图,把自己修改的图片替换保存,即可。 第2招、控制热盒的显示 MAYA中的热盒可以按着空格键不放,就可以显示出来。并且按下鼠标左键选择Hotbox Style 中的Zones Only可以不让热盒弹出。如果选择Center Zone Only可以连AW的字样也不会出现。完全恢复的快捷键是ALT+M。 第3招、创建多彩的MAY A界面 MAYA默认界面色彩是灰色的,如果你想尝试一下其他的色彩界面,可以自行修改。方法是选择Windows/Settings/Preferences/Colors... 第4招、创建自己的工具架 把自己最常用的工具放置在工具架的方法是,按下Ctrl+Shift的同时,点选命令,该命令就可以添加到当前的工具架上了。 第5招、自定义工具架图标 我们将一行MEL添加到工具架上的时候,图标出现MEL字样,不容易区分,此时可以选择Windows/Settings/Preferences/Shelves选择新添加的命令,单击Change Image按钮,选择要替换的图片,选择Save All Shelves按钮,就替换成功。 第6招、自定义标记菜单 执行Windows/Settings/Preferences/Marking Menus设置相关参数,然后在Settings下符合自己操作习惯来设置参数,最后单击Save即可。 第7招、自定义物体属性 如果想添加一个属性,并且把其他数据进行设置表达式或者驱动关键帧,就必须在属性对话框中点击Attributes/add... 第8招、选择并且拖动 打开Windows/Settings/Preferences在Selection中,勾选Click Drag Select然后点击Save这样就可以了。 第9招、界面元素隐藏或显示 执行Display/UI Elements下的Show UI Elements或者Hide UI Elements可以对于全界面下元素显示或者隐藏。 第10招、改变操纵器的显示大小与粗细 打开Windows/Settings/Preferences在Manipulators中修改Line Size可以改变操纵器的显示粗细,按下小键盘的“+”“-”可以改变操纵器的显示大小。

hibernate_annotation

Hibernate Annotation 使用hibernate Annotation来映射实体 准备工作 下载 hibernate-distribution-3.3.2.GA hibernate-annotations-3.4.0.GA slf4j 导入相关依赖包 Hibernate HOME: \hibernate3.jar \lib\bytecode(二进制) \lib\optional(可选的) \lib\required(必须的) 导入required下的所有jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar log4j-1.2.14.jar mysql.jar ---Annotation包 ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar

简单的例子,通过annotation注解来映射实体PO 1、建立(Java Project)项目:hibernate_0100_annotation_HelloWorld_default 2、在项目根下建立lib目录 a)导入相关依赖jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar log4j-1.2.14.jar mysql.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar 3、建立PO持久化类cn.serup.model.Teacher 内容如下 package cn.serup.model; import javax.persistence.Entity; import javax.persistence.Id; //@Entity表示该是实体类 @Entity public class Teacher { private int id ; private String username ; private String password ; //ID为主键,主键手动分配 @Id public int getId() { return id; } public void setId(int id) { this.id = id;

相关主题