反射机制:在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称Java的反射机制。
反射相关的API在java.lang包下
Filed类:代表类的成员变量(类的属性)
Method类:代表类的方法
Constructor类:代表类的构造方法
Array类:提供了动态创建数组,以及访问数组的元素的静态方法
类反射
获得Class类对象三种方法:
(1)使用Class.forName("全路径");
(2)使用.class方法,只适合在编译前就知道操作的类
Class c=String.class;
(3)使用类对象的getClass()方法
String str=new String("Hello");
Class c=str.getClass();
字段反射
跟构造方法一样有四种**
Field[] fields=c.getFields();-----可遍历
方法反射
跟构造方法一样有四种**
Method[] methods=c.getMethods();----可遍历
getMethod("方法名",参数类型);----m.invoke(实例化对象,"参数")方法调用得到的方法
构造函数反射--构造方法无返回值
获得所有的公有的构造方法:Constructor[] ctrs=c.getConstructors();
获得指定参数类型的公有的构造方法:Constructor c1=c.getConstructor(new Class[]{String.class,int.class});
获得所有类型的构造方法:Constructor[] cttrs2=c.getDeclaredConstructors();
获得指定任何类型的构造方法:Constructor c2=c.getDeclardConstructor(new Class[]{new String.class});
反射对象的创建
newInstance();通过类的不带参数的构造方法创建这个类的一个实例对象。
Class<?> c=null;
例如1:c=Class.forName("xxx.Person");
Constructor ctr=c.getConstructor(new Class[] {String.class, int.class});
Person p=(Person)ctr.newInstance("谢军帅",20);//创建并实例化一个对象
2.c=Class.forName("xxx.Person");
Person p=(Person)c.newInstance();
反射字段的访问
数组反射
Array类--->对数组的操作
eg:Array.getLength(数组的引用);
isArray();
使用Array类遍历数组Array.get(数组名,下标);
1 package Xie; 2 3 import java.lang.reflect.Array; 4 5 public class ArrayDemo { 6 7 public static void main(String[] args) { 8 Person[] persons=new Person[] { 9 new Person("张三",19), 10 new Person("李四",28), 11 new Person("王五",17) 12 }; 13 System.out.println("数组的长度:"+Array.getLength(persons)); 14 Class<? extends Person[]> c=persons.getClass(); 15 System.out.println(c.isArray()); 16 //使用Array类遍历数组 17 for(int i=0;i<Array.getLength(persons);i++) { 18 System.out.println(Array.get(persons, i)); 19 } 20 } 21 }
使用反射得到一个对象
(1)获取类Class对象实例
Class c=Class.forName("全类名");
(2)根据Class对象实例获取Constructor对象
(3)使用Constructor对象的newInstance方法获取反射类对象
1 package Xie; 2 3 import java.lang.reflect.Constructor; 4 5 public class DynamicinstanceDemo { 6 7 public static void main(String[] args) { 8 Class<?> c=null; 9 try { 10 c=Class.forName("Xie.Person"); 11 Constructor<?> ctrs=c.getConstructor(new Class[] {String.class,int.class}); 12 Person p=(Person) ctrs.newInstance("谢军帅",18); 13 System.out.println(p.toString()); 14 } catch (Exception e) { 15 e.printStackTrace(); 16 } 17 } 18 }