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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
object Test1 {
class Foo {
@remote
def foo: Unit = ()
}
def run {
val method = classOf[Foo].getMethod("foo", Array())
method.getExceptionTypes foreach println
}
}
object Test2 {
import java.io.{BufferedReader,FileReader, IOException}
class Reader(fname: String) {
private val in = new BufferedReader(new FileReader(fname))
@throws(classOf[IOException])
def read() = in.read()
}
def run {
val method = classOf[Reader].getMethod("read", Array())
method.getExceptionTypes foreach println
}
}
/* Java:
public class Main {
@Deprecated
public void foo() {}
public static void main(String[] args) throws Exception {
Method method = Class.forName("test.Main").getMethod("foo", new Class[]{});
Annotation annotation = method.getAnnotation(Deprecated.class);
System.out.println(annotation); // @java.lang.Deprecated()
}
}
*/
object Test3 {
import java.lang.Deprecated
class Foo {
@Deprecated
def foo: Unit = ()
}
def run {
val method = classOf[Foo].getMethod("foo", Array())
val annotation = method.getAnnotation(classOf[Deprecated])
println(annotation)
}
}
/* Java:
@Retention(value=RetentionPolicy.RUNTIME)
@interface Source {
public String url();
public String mail();
}
@Source(url="http://scala.epfl.ch", mail="scala@lists.epfl.ch")
class Foo {}
public class Main {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("test.Foo");
Annotation[] annotations = clazz.getAnnotations();
for (int i = 0; i < annotations.length; i++)
System.out.println(annotations[i]);
// @test.Main$Source(url=http://scala-lang.org, mail=scala@lists.epfl.ch)
}
}
*/
object Test4 {
import test.SourceAnnotation // defined in SourceAnnotation.java
@SourceAnnotation{val value = "http://scala-lang.org",
val mails = Array("scala@lists.epfl.ch", "scala-lounge@lists.epfl.ch")}
class Foo1
@SourceAnnotation("http://bloodsuckers.com") { val mails = Array("you@bloodsuckers.com") }
class Foo2
@SourceAnnotation("http://bloodsuckers.com")
class Foo3
class Foo4 {
@SourceAnnotation("file:///dev/null")
val x = 1
@SourceAnnotation("file:///dev/zero")
def bar: Int = 0
}
def run {
import java.lang.annotation.Annotation
import java.lang.reflect.AnnotatedElement
def printSourceAnnotations(target: AnnotatedElement) {
//print SourceAnnotation in a predefined way to insure
// against difference in the JVMs (e.g. Sun's vs IBM's)
def printSourceAnnotation(a: Annotation) {
val ann = a.asInstanceOf[SourceAnnotation]
println("@test.SourceAnnotation(mails=" + ann.mails.deepMkString("{", ",", "}") +
", value=" + ann.value + ")")
}
val anns = target.getAnnotations()
anns foreach printSourceAnnotation
if (anns.length > 0) {
println(target)
println
}
}
printSourceAnnotations(classOf[Foo1])
printSourceAnnotations(classOf[Foo2])
printSourceAnnotations(classOf[Foo3])
classOf[Foo4].getDeclaredFields foreach printSourceAnnotations
classOf[Foo4].getDeclaredMethods foreach printSourceAnnotations
}
}
object Test5 {
import scala.reflect.BeanProperty
class Count {
// we use "Integer" instead of "Int" because of Java reflection
@BeanProperty
private var count: Integer = 0
private val getter =
getClass().getMethod("getCount", Array[java.lang.Class]())
private val setter =
getClass().getMethod("setCount", Array[java.lang.Class](classOf[Integer]))
def get = getter.invoke(this, Array()).asInstanceOf[Integer].intValue
def set(n: Int) = setter.invoke(this, Array(new Integer(n)))
}
def run {
val count = new Count
println(count.get)
count.set(99)
println(count.get)
}
}
object Test {
def main(args: Array[String]) {
Test1.run
Test2.run
Test3.run // requires the use of -target:jvm-1.5
Test4.run
Test5.run
}
}
|