------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
什么是反射?
毕老师说“万物皆对象”,每个Java类可以构成一个对象,同时每个Java类也可以由一个Class类封装成对象,反射就是把类中的成员变量,构造函数,方法,包都封装成类,在封装的类中,操作类和类中的成员。
为什么要用反射?
在框架结构中反射用的最多,这就像生产一部汽车,我们这里有一副汽车构造图,而轮子,车身,发动机等车的部件通过不同的部门生产出来,最后装配在一起,实现了流水线高效率的生产!我们程序员开发软件,框架就像软件开发的构造图,我们每个程序员不同的功能部分,最后所有程序员开发的代码拼在这个框架中,实现了软件高效率的开发!而在这个框架做好时,不同的功能部分的实现只要通过反射调用各个类,就可以实现不同功能模块的组装!反射对高效率的开发是很关键的!
Class对象三种实现方式
Class cls1= String.class;
Class cls2 = new string().getClass();
Class cls3 = Class.forName("java.lang.String");
构造函数的反射
获取构造函数的Constructor对象
byte[] a = new byte[3];
Constructor constuctor1 = Class.forName("java.lang.String").getConstructor(byte[].class,int.class,int.class);
Constructor constuctor2= Class.forName("java.lang.String").getConstructors();
通过Constuctor建立对象
String str1 = constuctor.newIntance(a,0,a.length);
注意:cls1.newInstance()也是可以直接创建对象的
成员变量的反射
class Student
{
public int x;
private int y;
Student(int x,int y)
{
this,x = x;
this.y = y;
}
}
Student stu = new Student(2,3);
获取成员变量的Field类对象
Field field1 = Class.forName("java.lang.Student").getField("x");
Field field2 = Class.forName("java.lang.Student").getFields();
Field field3 = Class.forName("java.lang.Student").getDeclaredField("y");
获取Field类对象的值
field1.get(stu);
field3.setAccessible(ture);
field2.get(stu);
修改成员变量的值
field1.set(stu,3);
方法的反射
获取方法Method类对象
String str = new String("abced");
Method method1 = str1.getClass().getMethod("CharAt",int.Class);
Method method2 = str1.getClass().getMethods();
调用某个对象的方法
method1.invoke(str,2);
注意,如果method1.invoke(null,2)表示调用的是静态方法
在jdk 1.4版本中调用应该为method1.invoke(str,new Object[]{2});
数组的反射
获取数组的Class对象
int[] a = new int[3];
int[] b = new int[4];
int[] [] c = new int[3][4];
String[] d = new String[3];
Class cls1 = a.getClass();
Class cls2 = b.getClass();
Class cls3 = c.getClass();
Class cls4= d.getClass();
其中 cls1 == cls2,只要类型和维度一样,数组的Class对象即相等
创建数组对象
Object array =Array.newInstance(cls1,10);
为数组某个位置赋值
Array.set(array,5,4)
获取数组的值
Array.get(array,5);
1 练习: 2 写一个程序,这个程序能够通过用户指定的类名去执行该类的main方法。 3 package bolgtest; 4 5 import java.lang.reflect.Method; 6 7 public class BolgTest1 { 8 public static void main(String[] args) throws Exception{ 9 10 Class cls = StudentTest.class; 11 Method method = cls.getMethod("main", String[].class); 12 method.invoke(null, new Object[]{new String[]{"abc","dgf"}}); 13 14 } 15 16 } 17 18 19 package bolgtest; 20 public class StudentTest{ 21 public static void main(String[] args){ 22 Student stu = new Student("zhangshan",23); 23 System.out.println(stu); 24 } 25 } 26 class Student { 27 private String name; 28 private int age; 29 30 public Student(String name, int age) { 31 super(); 32 this.name = name; 33 this.age = age; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 public String getName() { 41 return name; 42 } 43 44 public void setAge(int age) { 45 this.age = age; 46 } 47 48 public int getAge() { 49 return age; 50 } 51 public String toString() 52 { 53 return "name = " + name + "...." + "age = " + age; 54 } 55 56 57 58 } 59 60 61 62 63 64