在java中,只要给定类的名字,就可以利用反射机制来获得类的信息,类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字。
java 反射是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifiers( 诸如 public, static 等 )、superclass (例如 Object)、 实现之 interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。
Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 classes。 换言之,Java 可以加载一个运行时才得知名称的 class,获得其完整结构。
在jdk中,主要由以下类来实现java反射机制,这些类都位于java.lang.reflect包中。
1.Class类:代表一个类
2.Constructor类:代表类的构造方法
3.Field类:代表类的成员变量(成员变量也称为类的属性)
4.Method类:代表类的方法
运用上面的Class,Constructor,Field,Method四个类,就可以解析无穷多的系统类和自定义结构。
下面是具体的代码demo
这是被测试类A
1 package cn.yonyong.reflect.demo; 2 /** 3 * 4 * @author yonyong 5 * 6 */ 7 public class A { 8 private int num; 9 public A(){ 10 super(); 11 } 12 13 public A(int num) 14 { 15 super(); 16 this.num=num; 17 } 18 19 public void func1(){} 20 public void func2(){} 21 }
测试类
1 package cn.yonyong.reflect.demo; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 public class Test { 8 public static void main(String[] args) throws ClassNotFoundException { 9 // 1.加载并实例化制定类A 10 11 Class classInfo=Class.forName("cn.yonyong.reflect.demo.A"); 12 13 // 2.获取类A的构造方法 14 Constructor cons[]=classInfo.getConstructors(); 15 16 System.out.println("类A的构造方法如下所示:"); 17 for(int i=0;i<cons.length;i++) 18 { 19 System.out.println(cons[i].toString()); 20 } 21 22 System.out.println(); 23 24 // 3.获取类A的属性 25 Field fields[]=classInfo.getDeclaredFields(); 26 System.out.println("类A的属性如下所示:"); 27 28 for(int i=0;i<fields.length;i++) 29 { 30 System.out.println(fields[i].toString()); 31 } 32 33 // 4.获取类A的普通方法 34 System.out.println(); 35 Method methods[]=classInfo.getDeclaredMethods(); 36 System.out.println("类A的普通方法如下所示:"); 37 for(int i=0;i<methods.length;i++) 38 { 39 System.out.println(methods[i].toString()); 40 } 41 } 42 }
注意在测试类的11行,需要导入A的路径。如果只是A的话会报ClassNotFound异常。