1.反射的基本概念:
镜子,好比人站在镜子前,做CT,能看清楚这个人的五脏六腑
对象在镜子面前做CT,能看清楚这个对象的所有属性和方法
2.能反射出来什么东西:
必须获得类对象(3种)
1.属性 2.构造方法 3.类名 4.成员方法 5.注解 6.方法的修饰符,返回类型,参数类别,名字
通过反射创建对象
通过反射调用成员
通过反射执行构造方法
3.获得类对象的三种方法
Person p=new Person();
Class clazz1=p.getClass();//通过对象的getClass()获得类对象
Class clazz2=Person.class;//通过类名.class;获得类对象
Class clazz3=Class.forName("reflect1.Person");
//clazz1,clazz2,clazz3这三个引用指向的是同一个对象
System.out.println(clazz1.getName());
System.out.println(clazz2.getName());
System.out.println(clazz3.getName());
System.out.println(clazz1==clazz2);
System.out.println(clazz2==clazz3);
类对象是单例的,实际开发中第二第三中用的比较多
属性
//1.必须先有类对象
Class clazz=Class.forName("reflect1.Person");
Field []fields=clazz.getFields();
System.out.println("获取公有的属性");
for (Field f:fields
) {
System.out.println(f.toGenericString());//相当于同tostring()
}
fields=clazz.getDeclaredFields();
System.out.println("获取所有的属性");
for (Field f:fields
) {
System.out.println(f.toGenericString());//相当于同tostring()
}
Person p=new Person("张三丰",60);
Class clazz=Class.forName("reflect1.Person");
Field f=clazz.getField("adress");
System.out.println(f.toGenericString());
System.out.println(f.get(p));
//修改属性的值
f.set(p,"南阳市宛城区80号");
System.out.println("----------------修改过后---------------");
System.out.println(f.get(p));
System.out.println("*********************************************");
f=clazz.getDeclaredField("name");
//System.out.println(f.get(p));私有的属性没有权限访问
f.setAccessible(true);
System.out.println(f.get(p));
System.out.println("----------------修改过后---------------");
f.set(p,"张三风");
System.out.println(f.get(p));
通过反射获得父类还有接口的信息
Class clazz=Class.forName("reflect1.NBAplayer");
//通过反射获得父类信息
System.out.println(clazz.getSuperclass().getName());
//通过反射获得接口信息
Class[] classes=clazz.getInterfaces();
Type[] types=clazz.getInterfaces();
for (Class c:classes){
System.out.println(c.getName());
}
for (Type t:types){
System.out.println(t);
}
通过反射实例化对象
//Person p=new Person();
//System.out.println(p);
Class clazz=Class.forName("reflect2.Person");
//调用无参的构造方法,返回实例
// Person p=(Person) clazz.newInstance();
//System.out.println(p);
//反射出所有的构造方法,私有公有
/*
Constructor[] cons=clazz.getDeclaredConstructors();
for(Constructor con:cons ){
System.out.println(con.toGenericString());
}*/
Constructor con=clazz.getDeclaredConstructor(java.lang.String.class,int.class);
Person p= (Person) con.newInstance("张三丰",20);
System.out.println(p);
通过反射调用成员方法
Class clazz=Person.class;
Method[] methods=clazz.getMethods();
for(Method s:methods){
System.out.println(s.toGenericString());
}