??xml version="1.0" encoding="utf-8" standalone="yes"?> public class DeprecatedExample {
@Quality("Security")
@Quality("Performance")
@Quality("Readability")
public void foo(){
//
}
}
Java 8引入了Repeatable注解Q@RepeatableQ可以解册一问题Q但光有可重复的注解定义q不够,q需要它的容器注解,两者一h实现可重复注解的使用。实例如下:
@Retention(RetentionPolicy.SOURCE)
@Repeatable (Qualities.class)
public @interface Quality {
String value();
}
public @interface Qualities {
Quality[] value();
}
其中QQuality是可重复注解Q由@Repeatable注解标明Q它的容器注解是QualitiesQ用于存放所有可重复的QualityQ存贮在Quality[]中)Q同时还要注意可重复注解和它的容器注解的目标元素必须是一LQ这也不a自明Q。如此这般,我们最开始的 SampleClass 在Java 8环境下就可以安全使用了?br />
]]>
private Singleton(){}
public static Singleton getInstance(){
return Helper.instance;
}
static class Helper {
private static Singleton instance = new Singleton();
}
}
]]>
在FilecM增加了以下方法:
public long getFreeSpace(): q回一个分区剩余空?BR>public long getTotalSpace(): q回一个分区ȝ?BR>public long getUsableSpace(): q回一个分区已用空?BR>注意Q以上File指代的虚拟\径必L盘符Q否则返??BR>
2. Splash Screen
Mustang对于Splash Screen的实现是一个用来显CgifQ可以是动画式的Q?PNG, jpg囄的没有修饰的H口
使用方式Q?BR>在java命o行中加入 -splash 选项,CZ如下Q?BR>java -splash mypic.jpg HelloWorld
如果你的cL以jar的方式来q行Q那么可以在jar文g的MANIFEST.MF文g中加入如下的一行:
SplashScreen-Image:mypic.jpg
你也可以在命令行中写Q?BR>java -splash:mypic.jpg -jar helloWorld.jar
q里用的囄替代MANIFESET.MF中定义的囄Q如果有的话Q?BR>
Z实现自定义的Splash Screen界面Q你可以使用如下的方法:
//使用SplashScreen的静态方法获得SplashScreen对象Q然后自定义
SplashScreen ss = SplashScreen.getSplashScreen ();
if (ss != null)
{
// 自定义代码?BR>}
在SpalshScreen中还提供了如下方法,具体使用LJDK或访问sun|站
public Graphics getGraphics()
public URL getImageURL()
public Dimension getSize()
public void setImageURL(URL imageURL):
public void update()
值得注意的是Q你必须使用 -spalsh选项或MANIFEST.MF的方式来调用SplashScreenQ?BR>否则修改是无效的?img src ="http://www.aygfsteel.com/robin/aggbug/27569.html" width = "1" height = "1" />
]]>
1. ~写自定义@Todo注解
l常我们在写E序Ӟ有时候有些功能在当前的版本中q不提供Q或׃某些其它原因Q有些方法没有完成,而留待以后完成,我们在javadoc中用@TODO来描q这一行ؓQ下面用java注解来实现?BR>
public @interface Todo { } // Todo.java
如果你想让这个注解类型能够自省的话,l它加上@Todo注解Q写法如下:
@Todo
public @interface Todo{ }
下面我们l这个注解接受参数的能力Q代码如下:
@Todo("Just articleware")
public @interface Todo{
public enum Priority { LOW, MEDIUM, HIGH }
String value();
String[] owners() default "";
Priority priority() default Priority.MEDIUM;
}
注意Q?/B>注解cL所能接受的参数cd有着严格的规则:
a. 参数cd只能是:primitive, String, Class, enum, annotation, 或者是数组Q?BR>b. 参数g能ؓI,因此每一个参数值都要定义一个缺省|
c. 名字为value的参数可以用便的Ҏ来设|;
d. 参数的写法如同写单方法(看如上代码)Q不允许加入参数Q不允许有throws子句{?BR>
在上面的代码中,我们为@Todo定义?个参? 分别是value, owners, priority. 注意Q由于value的特D性,它的的却省值可以由上面代码中的"Just articleware"来定义,当然你也可以单独写一个缺省倹{?BR>
下面看一个应用@Todo注解的例子:
@Todo(
value="Class scope",
priority=Unfinished.Priority.LOW
)
public class TodoDemo {
@Todo("Constructor scope")//通过快捷方式Q设|value的?
public TodoDemo() { }
@Todo(owner="Jason", value="Method scope")
public void foo() { }
}
上面的代码很单,不多介绍?BR>
下面我们惌@Todo不能应用在fields, parameters, 或者local variablesQ因Ҏ们来说没有意义)Q它应当可以出现在javadoc中;在运行是h持久性。要实现q些Ҏ,需要annotation包的支持啦?
2. 应用annotation包的支持
1Q@Documented
cdҎ的annotation~省情况下是不出现在javadoc中的Qؓ了加入这个性质我们用@Documented
应用代码如下(单,不多介绍Q:
package com.robin;
import java.lang.annotation.*;
@Todo("Just articleware")
@Documented
public @interface Todo{ ...
2Q@Retention
用来表明你的annotation的有效期Q可以有三种选择(如图所C?Q?BR>
以下CZ代码应用RUNTIME{略
package com.robin;
import java.lang.annotation.*;
@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo{ ...
3) @Target
@Target注解表明某个注解应用在哪些目标上Q可选择如下范围:
按我们的功能要求Q代码如下:
package com.robin;
import java.lang.annotation.*;
@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
public @interface Todo{ ...
4) @Inherited
@Inherited表明是否一个用某个annotation的父cd以让此annotation应用于子cR?BR>CZ代码如下Q?BR>
package com.robin;
import java.lang.annotation.*;
@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
@Inherited
public @interface Todo{
public enum Priority { LOW, MEDIUM, HIGH }
String value();
String[] owners() default "";
Priority priority() default Priority.MEDIUM;
}
]]>
1. @Override
@Override用在多态情况下Q比如:
public abstract class Animal{
public void say(){
System.out.println("annimal is saying");
}
}
public class Cat extends Animal{
@Override
public void say(){
System.out.println("miao, miao");
}
}
通过@Override来告诉java~译器,sayҎ是重载的父类的方法,q样Q当父类的sayҎ{改名的话Q比如增加了一些参敎ͼ那么子类的Cat中的sayҎ~译时就会报错,说没有正的重蝲父类ҎQ所以,@Override可以帮我们验证程序的正确性,q一点,很有用?BR>
2. @Deprecated
@Deprecated的意思和JavaDoc中的@deprecated注释在本质上是一LQ用如下:
@Deprecated
public static void badMethod() { }
}
public class DeprecatedUser {
public static void main(String[] args){
DeprecatedExample.badMethod();
}
}
上面的代码如果用javacq行~译的话Q会打印出如下信?
Note: DeprecatedUser.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
如果你按提示重新?Xlintq行~译Q你可以得到错误的详细信息Q?BR>% javac -Xlint:deprecation
DeprecatedUser.java:3: warning: [deprecation] badMethod() in DeprecatedExample
has been deprecated
DeprecatedExample.badMethod();
需要注意的是:和javadoc中的@deprecated相比Q@Deprecatedq没有强大多,因ؓ它不支持参数Q而@deprecated后面q可以跟字符串来l一些相关的信息Q但@Deprecated做不刎ͼ但它提供了运行时自省的功能,来提C错误,所以徏议@Deprecated和@deprecated同时使用?/FONT>
3. @SuppressWarnings
思义Q就是抑制警告信息的出现Q用如下:public class DeprecatedExample2{
@Deprecated
public static void foo() { }
}
public class DeprecatedUser2 {
@SuppressWarnings(value={"deprecation"})
public static void main(String[] args) {
DeprecatedExample2.foo();
}
}
上述@SuppressWarnings(value={"deprecation"})的作用就是抑制编译器报deprecation的错?BR>@SuppressWarnings(value={"deprecation"})只支持一个参敎ͼ是数l类型,所以你可以不用加value, 写成Q@SuppressWarnings({"deprecation"})Q当x制多个类型的警告信息Ӟ可写Q@SuppressWarnings({"unchecked","fallthrough",deprecation"}).
注意Q在JDK1.5.0 release中,@SuppressWarningsq没有得到完全支持,会在以后支持Q但Sunq没有给出具体的旉?/FONT>