黑马程序员——反射总结

什么是反射?
毕老师说“万物皆对象”,每个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     

 

posted @ 2015-12-26 14:13  yuemingxingxing  阅读(246)  评论(0编辑  收藏  举报