Java的反射机制概念
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
反射的作用
1 可以反编译将class文件编译成java文件
2 可以通过反射机制访问Java对象的属性,方法,构造方法等
反射机制使用步骤
1 得到要调用类的class
2 通过得到的class获取调用类型的方法(Method)
3 通过方法(Method)的invoke进行方法调用
反射机制常用场景
1 通过反射获取构造方法从而来产生相应的对象,代码如下:
1 import java.lang.reflect.Constructor;
2
3 /**
4 *
5 *
6 * 通过构造方法产生对象
7 *
8 */
9 public class ReflectionHelloWorld3 {
10
11 /**
12 *
13 */
14 public ReflectionHelloWorld3() {
15 // TODO Auto-generated constructor stub
16 }
17
18 /**
19 * @param args
20 */
21 public static void main(String[] args) {
22 // TODO Auto-generated method stub
23 Class<?> c = null;
24 try {
//通过全路径名获取对应的Class
25 c = Class.forName("com.msunsoft.reflection.Foo2");
26 } catch (Exception e) {
27 e.printStackTrace();
28 }
29 Foo2 f1 = null;
30 Foo2 f2 = null;
31 //获取所有的构造方法
32 Constructor<?> cons[] = c.getConstructors();
33 try {
34 f1 = (Foo2) cons[0].newInstance();
35 f2 = (Foo2) cons[1].newInstance("abc");
36 f1.print();
37 f2.print();
38
39 } catch (Exception e) {
40 e.printStackTrace();
41 }
42
43 }
44
45 }
Foo2代码如下:
/**
*
*/
package com.msunsoft.reflection;
/**
* @author anquan li
*
*/
public class Foo2 {
String s;
/**
*
*/
public Foo2() {
// TODO Auto-generated constructor stub
}
public Foo2(String s) {
this.s = s;
}
public void print() {
System.out.println(s);
}
}
运行代码输出: null,abc
2 通过反射机制修改数组大小,代码如下:
1 package com.msunsoft.reflection;
2
3 import java.lang.reflect.Array;
4
5 /**
6 *
7 *
8 * 修改数组大小
9 *
10 */
11 public class ReflectionHelloWorld4 {
12
13 /**
14 *
15 */
16 public ReflectionHelloWorld4() {
17 // TODO Auto-generated constructor stub
18 }
19
20 /**
21 * @param args
22 */
23 public static void main(String[] args) {
24 // TODO Auto-generated method stub
25 int[] intArray = { 1, 2, 3, 4, 5 };
26 int[] newIntArray = (int[]) changeArraySize(intArray, 10);
27 print(newIntArray);
28
29 String[] str = { "a", "b", "c", "d", "e" };
30 String[] str1 = (String[]) changeArraySize(str, 10);
31 print(str1);
32
33 }
34
35 private static void print(Object obj) {
36 // TODO Auto-generated method stub
37 Class<?> c = obj.getClass();
38 if (!c.isArray()) {
39 return;
40 }
41 System.out.println("\nArray length: " + Array.getLength(obj));
42
43 for (int i = 0; i < Array.getLength(obj); i++) {
44 System.out.print(Array.get(obj, i) + " ");
45 }
46
47 }
48
49 /**
50 * 修改数组大小
51 *
52 * @param obj
53 * @param i
54 * @return
55 */
56 private static Object changeArraySize(Object obj, int len) {
57 // TODO Auto-generated method stub
58 Class<?> arr = obj.getClass().getComponentType();
59 Object newArray = Array.newInstance(arr, len);
60
61 // 复制数组
62 int co = Array.getLength(obj);
63 System.arraycopy(obj, 0, newArray, 0, co);
64 return newArray;
65 }
66
67 }
运行程序输出如下结果:
Array length: 10
1 2 3 4 5 0 0 0 0 0
Array length: 10
a b c d e null null null null null
原文:http://www.cnblogs.com/anqli-java/p/7559676.html