1. 反射(重点)
1.1 反射概述
概述:反射对象,就是类对象,是类加载的产物,
只要有了类对象,就可以知道类的所有信息(类名,接口,包名,属性,方法等)
获取类对象方式:
1.类名.class (常用)
2.对象.getClass()
3.Clas.forname("包名.类名") (常用)
结论:无论哪种方式获取的类对象,都是同一个
Class class1 = Person.class;
Class class2 = new Person().getClass();
Class class3 = Class.forName("com.qf.d_reflect.Person");
System.out.println(class1==class2); //true
System.out.println(class1==class3); //true
1.2 反射常用方法
Class clazz1 = Person.class; //获取反射对象
System.out.println(clazz1.getName()); //获取类名
System.out.println(clazz1.getPackage()); //获取包名
System.out.println(clazz1.getSuperclass()); //获取父类
System.out.println(Arrays.toString(clazz1.getInterfaces())); //获取接口
System.out.println(Arrays.toString(clazz1.getFields())); //性能高,不能处理私有权限属性
System.out.println(Arrays.toString(clazz1.getDeclaredFields())); //(常用)可以处理私有权限
System.out.println(Arrays.toString(clazz1.getMethods()));//(常用)
System.out.println(Arrays.toString(clazz1.getConstructors())); //获取所有构造器
System.out.println(clazz1.getDeclaredField("name")); //(常用) 获取Field对象
System.out.println(clazz1.getMethod("test")); //(常用) 获取Method对象
System.out.println(clazz1.newInstance()); //调无参构造 (常用)
1.3 反射操作属性
通过反射对象,给私有属性赋值及取值
1.获取反射对象
2.获取Field对象
3.调用set方法赋值 ,通过get方法取值
Class clazz = Student.class;
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); //开启私有权限
Student st = (Student) clazz.newInstance();
field.set(st, "zsf");
1.4 反射操作方法
1.获取反射对象
2.通过反射获取Method对象,传方法名和反射类型
3.通过Method对象调invoke方法
反射作用:可以灵活动态操作属性和方法
Class<Student> class1 = Student.class;
//获取Method对象,参数1:方法名 后面参数:参数类型反射对象
Method method = class1.getMethod("hello", String.class,int.class);
method.invoke(class1.newInstance(), "小明",28);
}
1.5 反射应用场景
//使用反射灵活获取对象
Teacher t1 = Tool.getObject(Teacher.class);
Student s1 = Tool.getObject(Student.class);
System.out.println(t1+"---"+s1);
//泛型方法
public static <T> T getObject(Class<T> class1) throws InstantiationException, IllegalAccessException {
return class1.newInstance();
}
浙公网安备 33010602011771号