1.什么是反射?
反射是框架设计的灵魂,框架:它是一个半成品,可以拿来使用,添加上自己的业务代码。提高开发效率。
反射就是把类中成员抽取成其他类的过程。这就是反射。
2. 如何获取反射类对象--Class
三种方式可以获取反射类对象:
(1) 通过Class.forName获取反射对象.
Class.forName("全路径")
--spring它就是使用的该模式<bean class="全路径">
(2)通过类名.class获取
类名.class;
---代理类--->SqlSession.getMapper(StudentDao.class)
(3) 通过对象.getClass()方法获取
对象.getClass();
---当知道对象时可以通过这种方式获取反射对象
代码:
public class Test {
public static void main(String[] args) throws Exception{
//通过Class.forName获取反射对象.
Class aClass = Class.forName("demo01.Student");
//通过类名.class获取
Class studentClass = Student.class;
//通过对象.getClass()方法获取
Student student = new Student();
Class aClass1 = student.getClass();
//比对这三个反射对象的引用地址是否一致。一个类只会被加在到内存中一次。
System.out.println(aClass==studentClass);
System.out.println(studentClass==aClass1);
}
}
3.通过反射类获取对应的类对象。
public class Test02 {
public static void main(String[] args) throws Exception{
//获取反射类对象
Class<Student> studentClass = Student.class;
//由反射类创建类对象---调用为无参构造函数
Student student = studentClass.newInstance();
//由反射类创建类对象---调用为无参构造函数
Student student2 = studentClass.newInstance();
//比对的地址是否相同---不相同
System.out.println(student==student2);
}
}
4.通过反射获取对应的Field属性对象。
public class Test03 {
public static void main(String[] args) throws Exception{
Class<?> aClass = Class.forName("demo01.Student");
//获取本类中指定的属性对象
Field name = aClass.getDeclaredField("name");
System.out.println(name);
//获取本类以及父类中指定的属性---必须为public修饰的。
Field sex = aClass.getField("sex");
System.out.println(sex);
//获取本类中所有的属性对象
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.1Field属性对象中常见的方法。
getName():获取属性名
setAccessible(true):设置属性可访问。
set(o,v):为对象o的属性赋值v
get(o):获取对象o的属性值
代码:
public class Test04 {
public static void main(String[] args) throws Exception{
Class<Student> studentClass = Student.class;
//获取属性的名称
Field nameField = studentClass.getDeclaredField("name");
Field age = studentClass.getDeclaredField("age");
String name = nameField.getName();
System.out.println("属性名称:"+name);
//为属性赋值
Student student = studentClass.newInstance();
System.out.println(student);
nameField.setAccessible(true);//为nameField设置可访问权限,打破了封装性
nameField.set(student,"张三");
age.set(student,20);
System.out.println(student);
//获取属性值
Object o = nameField.get(student);
Object o1 = age.get(student);
System.out.println(o);
System.out.println(o1);
//nameField.getAnnotation();//获取nameField属性上的注解对象
}
}
5.通过反射获取对应的Method方法对象
public class Test05 {
public static void main(String[] args) throws Exception{
Class<Student> studentClass = Student.class;
//获取本类中所有的方法。
Method[] declaredMethods = studentClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
System.out.println("================================================");
//获取本类和父类中所有public修饰的方法
Method[] methods = studentClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//本类中指定的方法对象
Method show = studentClass.getDeclaredMethod("show");
System.out.println(show);
Method setName = studentClass.getDeclaredMethod("setName", String.class);
System.out.println(setName);
System.out.println("*************************************************");
//获取本类和父类中指定名称的方法对象
Method equals = studentClass.getMethod("equals", Object.class);
System.out.println(equals);
//method.invoke(对象,方法参数值)
Student student = studentClass.newInstance();
setName.invoke(student,"李四");//回调,动态代理。
}
}
5.1Method类中常见的方法。
//method.invoke(对象,方法参数值);
invoke(people,"15");//回调。动态代理
6.获取相应注解对象
public class Test01 {
public static void main(String[] args) throws Exception{
Class<Student> studentClass = Student.class;
//获取类对象的指定注解
MyAnnotation annotation = studentClass.getAnnotation(MyAnnotation.class);
System.out.println(annotation.value());
//获取类属性的指定注解
Field name = studentClass.getDeclaredField("name");
MyAnnotation annotation1 = name.getAnnotation(MyAnnotation.class);
System.out.println(annotation1.value());
//获取类方法的指定注解
Method show = studentClass.getDeclaredMethod("show");
MyAnnotation annotation2 = show.getAnnotation(MyAnnotation.class);
System.out.println(annotation2.value());
System.out.println(annotation2.sex());
}
}