Step By Step(Java 反射篇) (三)

2014-11-24 03:19:38 · 作者: · 浏览: 7
t

15 java.util.AbstractCollection

16 java.lang.Object

17 */

6) 获取实现的接口:

在Java中并没有像C++那样支持多重继承,而是提供了一种更为安全和合理的方式,即单一继承和多实现,这里的单一继承是指继承(extends)一个超类,多实现是指可以实现(implements)多个接口。下面的例子将让我们获取某个类所实现的接口,如下:

1 public static void main(String[] args) {

2 Class< >[] interfaces = LinkedList.class.getInterfaces();

3 if ((interfaces != null) && (interfaces.length > 0)) {

4 if (LinkedList.class.isInterface())

5 System.out.print(" extends ");

6 else

7 System.out.print(" implements ");

8 for (int i = 0; i < interfaces.length; i++) {

9 if (i > 0)

10 System.out.print(", ");

11 System.out.print(interfaces[i].getName());

12 }

13 }

14 }

15 /* 输出结果如下:

16 implements java.util.List, java.util.Deque, java.lang.Cloneable, java.io.Serializable

17 */

7) 获取包名:

1 public static void main(String[] args) {

2 System.out.println(String.class.getPackage().getName());

3 }

4 /* 输出结果如下:

5 java.lang

6 */

2. 基于数组的反射:

1) 通过反射创建数组实例:

1 public static void main(String[] args) {

2 int[] dim1 = { 5 };

3 //通过Array的newInstance方法构造新的数组实例,这里的dim1定义了

4 //oneDimA的维度,以及在该维度内的长度

5 int[] oneDimA = (int[]) Array.newInstance(int.class, dim1);

6 //第二个参数定义了一维数组的长度

7 int[] oneDimB = (int[]) Array.newInstance(int.class, 5);

8 System.out.println("The length of oneDimA is " + oneDimA.length);

9 System.out.println("The length of oneDimB is " + oneDimB.length);

10 if (Arrays.equals(oneDimA, oneDimB))

11 System.out.println("OneDimA is equal to oneDimB");

12

13 int[] dimStr = { 5, 10 };

14 //这里通过dimStr来定义一个5*10的二维String数组。

15 String[][] twoDimStr = (String[][]) Array.newInstance(String.class,dimStr);

16 System.out.println("The length of twoDimStr is " + twoDimStr.length);

17 for (int i = 0; i < twoDimStr.length; ++i) {

18 System.out.print(twoDimStr[i].length + "\t");

19 }

20 }

21 /* 输出结果如下:

22 The length of oneDimA is 5

23 The length of oneDimB is 5

24 OneDimA is equal to oneDimB

25 The length of twoDimStr is 5

26 10 10 10 10 10

27 */

2) 获取原始类型和原始类型数组的类型名称:

1 public static void main(String[] args) {

2 System.out.println(int.class.getName());

3 System.out.println(int[].class.getName());

4 System.out.println(byte.class.getName());

5 System.out.println(byte[].class.getName());

6 }

7 /* 输出结果如下:

8 int

9 [I

10 byte

11 [B

12 */

可以看到数组的名称前面带有一个[,这是数组名称的表示方式,二维数组则表示为[[,后面的I表示int,B表示byte。这是JVM提供的一套类型名称编码规范,我会在后面关于本地代码(JNI)的Blog中给出更为明确的列表和使用方式,因为他们在JNI中应用还是比较广泛的。

3) 判断当前对象是否为数组:

1 public static void main(String[] args) {

2 Object o = new int[10];

3 boolean b = o.getClass().isArray();

4 if (b) {

5 System.out.println("object is an array");

6 }

7 }

8 /* 输出结果如下:

9 object is an array

10 */

4) 获取数组的维度:

1