------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
因为反射部分是转载的,没通过老师的审核,现在自己写下对反射的理解。纯手打哦!
先说概念:”反射就是把JAVA类中的各种成分,映射成新的JAVA类“
举个例子:
class Student
{
private String name;
int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public void outInfo()
{
System.out.println(name+"::"+age);
}
}
上面是简单地定义一个类,这个类中包含了,构造方法,成员变量,成员方法。
那么,构造方法可以提取出来,形成一个类,我暂且称之为“构造方法类”吧。用Constructor表示。
成员变量可以提取出来,形成一个类,我暂且称之为“成员变量类”吧。用Field表示。
成员方法可以提取出来,形成一个类,我暂且称之为“成员方法类”吧。用Method表示。
所有的JAVA类中都有构造方法,成员变量,成员方法。所以可以理解为:所有的构造方法是一个类,所有的成员变量是一个类,所有的成员方法是一个类。
这三个类就分别是:Constructor、Field、Method
这三个类中还封装了不同的方法,来方便我们操作,具体的可以查看API
——————————————————————————————————————————————————————————————
下面分别针对这三个类,举一个例子。这些例子在视频里都有讲过
(1)构造方法的反射:
Constructor c1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)c1.newInstance(new StringBuffer("abc"));
//或者是String obj = (String)Class.forName("java.lang.String").newInstance();
(2)成员变量的反射:
Student s1 = new Student("zhangsan",20);
Field f = s1.getClass().getField("age");
System.out.println(f.get(s1));
如果变量被private修饰,那么就要用到“暴力反射”
getDeclaredField("age");
f.setAccessible(true);
(3)成员方法的反射:
method methodCharAt = String.class.getMethod("charAt",int.class);
methodCharAt.invoke(str1,1);
//第一个参数是“你想invoke谁的方法”,第二个参数是“这个方法的参数”