这一篇并不想过多的介绍Java中关于反射的概念,我想即便是对于Java的初学者而言也并不感到陌生,该篇将一如既往的为您提供大量的可执行示例代码和丰富的注释信息,尽可能覆盖Java反射的各个技术环节,从更多的视角为您剖析反射的机制和应用场景,以及它在效率方面的不尽如人意之处。
1. 类属性反射:
每一个Java对象都会包含一个描述其属性(metadata)信息的类对象,该对象将作为Java反射中最重要的一个入口点,几乎所有和反射相关的应用都是从这里开始的。
1) 反射类的名字:
1 public static void main(String[] args) {
2 String str = "Hello";
3 //1. 获取Java对象的类对象(Class),也可以通过class域字段直接获取,如:
4 //c = str.class;
5 Class< extends String> c = str.getClass();
6 //2. 获取Java对象的字符串表示的名称
7 System.out.println(c.getName());
8 }
9 /* 输出结果如下:
10 java.lang.String
11 */
2) 通过表示类名称的字符串获取该类的对象实例:
1 public static void main(String[] args) {
2 try {
3 //1. 通过表示类名的字符串,获取该类的类对象(描述String的类metadata信息)
4 Class< > cls = Class.forName("java.lang.String");
5 //2. 再通过Class
6 //String的实例,这样要求被实例化的类带有缺省构造函数。
7 //因为newInstance方法只有这一种签名方式。
8 String s = (String) cls.newInstance();
9 } catch (ClassNotFoundException e) {
10 e.printStackTrace();
11 } catch (InstantiationException e) {
12 e.printStackTrace();
13 } catch (IllegalAccessException e) {
14 e.printStackTrace();
15 }
16 }
3) 反射类的修饰符:
1 public static void main(String[] args) {
2 String str = "Hello";
3 Class< extends String> c = str.getClass();
4 //获取的类在声明时定义的修饰符,既该类是否为public、final和abstract
5 int m = c.getModifiers();
6 if (Modifier.isPublic(m))
7 System.out.println("public");
8 if (Modifier.isAbstract(m))
9 System.out.println("abstract");
10 if (Modifier.isFinal(m))
11 System.out.println("final");
12 }
13 /* 输出结果如下:
14 public
15 final
16 */
4) 获取类的域字段、构造函数和域方法的访问修饰符信息:
1 public class MyTest {
2 public static void main(String[] args) {
3 MyTest pp = new MyTest();
4 pp.doClass("java.lang.String");
5 }
6 protected void doClass(String className) {
7 try {
8 Class< > c = Class.forName(className);
9 System.out.println(Modifier.toString(c.getModifiers()) + ' ' + c + " {");
10 //通过类的metadata属性信息,获取类的域字段,但是不包括超类中的字段
11 //这其中getFields()方法将仅仅返回当前类的public域字段
12 Field fields[] = c.getDeclaredFields();
13 for (Field f : fields) {
14 if (Modifier.isPrivate(f.getModifiers())) {
15 System.out.println("Field '" + f.getName() + "' is private.");
16 } else if (Modifier.isProtected(f.getModifiers())) {
17 System.out.println("Field '" + f.getName() + "' is protected.");
18 } else if (Modifier.isPublic(f.getModifiers())) {
19 System.out.println("Field '" + f.getName() + "' is public.");
20 } else if (Modifier.isFinal(f.getModifiers())) {
21 System.out.println("Field '" + f.getName() + "' is final.");
22 } else if (Modifier.isStatic(f