标签:
------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
黑马程序员——反射总结
标签:
原文地址:http://www.cnblogs.com/yuemingxingxing/p/5078043.html