反射是java里面一个很特殊的环节,我们一直都说java是一次编译,到处运行,有没有发现,我们都是说编译,然后是运行。但是对于反射来说,它不是出于编译期时,而是出于运行期。
也就是反射是在运行期期间获取类中的属性和方法,调用其中方法的一种机制。
反射里面最重要的一个环节就是获取Class对象,然后才能获取其中的属性和方法。至于什么是Class对象,Class对象什么时候生成?怎么生成?可以参考之前JVM类的加载文章。
那么获取Class对象有几种方式呢?三种。
1.Class.forName()获取Class对象。
2.对象.getClass()。
3.类.Type
public class Test {
public static void main(String[] args) throws Exception{
Class p1 = Class.forName("Person");
Person person =new Person();
Class p2 = person.getClass();
Class p3 = Person.class;
System.out.println(p1.toString());
System.out.println(p2.toString());
System.out.println(p3.toString());
System.out.println("获取方法");
Method[] methods = p1.getDeclaredMethods();
for(Method each: methods){
System.out.println(each.toString());
}
System.out.println("获取属性");
Field[] fields = p2.getDeclaredFields();
for(Field each: fields){
System.out.println(each.toString());
}
}
}
public class Person {
private int num;
private String name;
private String address;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"num=" + num +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
记得这三种获取方式就行,其实知道了怎么用就行了,如果想要知道点更深的内容,不用想,肯定是源码,去读源码吧。接下来我也会去读源码的。