1. 什么是反射?
反射是框架设计的灵魂,框架:它是一个半成品,可以拿来使用,添加上自己的业务代码。提高开发效率。
反射就是把类中成员抽取成其他类的过程。这就是反射。
![](https://img-blog.csdnimg.cn/7946870572d34426a5ff4763ac58e2e7.png)
2. 如何获取反射类Class
(1) 通过Class.forName获取反射对象.
Class.forName("全路径") --spring它就是使用的该模式<bean class="全路径">
(2)通过类名.class获取
类名.class; ---代理类--->SqlSession.getMapper(StudentDao.class)
(3) 通过对象.getClass()方法获取
对象.getClass();
---当知道对象时可以通过这种方式获取反射对象
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
//1.通过Class.forName来获取反射类对象。
Class aClass = Class.forName("demo.People");
//2.通过类名调用.class获取反射类对象
Class aClass1 = People.class;
//3.通过对象获取反射类对象
People p=new People();
Class aClass2 = p.getClass();
//思考:上面三个反射对象的引用地址是否一致! 是一致的。 一个类只会被加在到内存中一次。
System.out.println(aClass==aClass1);
System.out.println(aClass2==aClass1);
}
}
3. 根据反射类获取对应的类对象。
public class Test02 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
//1.获取反射类对象
Class<People> aClass = People.class;
//2.由反射类创建类对象---调用为无参构造函数
People people = aClass.newInstance();
People people2 = aClass.newInstance();
//3.他们的地址是否相同
System.out.println(people==people2);
}
}
4. 通过反射获取对应的Field属性对象
aclass.newInstance();
public class Test {
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("demo.People");
//获取本类中指定的属性对象
Field name = aClass.getDeclaredField("name");
System.out.println(name);
//获取本类以及父类中指定的属性---必须为public修饰的。
Field name1 = aClass.getField("sex");
System.out.println(name1);
//获取本类中所有的属性对象
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field:declaredFields) {
System.out.println(field);
}
//获取本类以及父类中所有public修饰的属性对象
Field[] fields = aClass.getFields();
for (Field field:
fields) {
System.out.println(field);
}
}
}
4.1 Field属性对象中常见的方法。
getName():获取属性名
setAccessible(true):设置属性可访问。
set(o,v):为对象o的属性赋值v
get(o):获取对象o的属性值
public static void main(String[] args) throws Exception {
Class<People> peopleClass = People.class;
Field nameField = peopleClass.getDeclaredField("name");
//1.获取属性的名称
String name = nameField.getName();
System.out.println("属性名称:"+name);
//2.为属性赋值.
//Object obj,对象
// Object value
People people = peopleClass.newInstance();
System.out.println(people);
nameField.setAccessible(true);//为nameField设置可访问权限,打破了封装性
nameField.set(people,"张三");
System.out.println(people);
//3.获取属性值
Object o = nameField.get(people);
System.out.println(o);
//nameField.getAnnotation();//获取nameField属性上的注解对象
}
5. 通过反射获取对应的Method方法对象
public class Test03 {
public static void main(String[] args) throws Exception {
Class<People> aClass = People.class;
//获取本类中所有的方法。
Method[] declaredMethods = aClass.getDeclaredMethods();
for (Method method:declaredMethods) {
System.out.println(method);
}
System.out.println("=========