反射API的使用
反射是java在编译阶段可以获取到任何类、任何对象的属性、方法和构造方法的机制。
获取类对象的方式
获取一个类对象有三种方式:
//方式1:Class.forName(className)
Class clazz = Class.forName("com.zouzou.entity.Employee");
//方式2:类名.class
Class clazz = Employee.class;
//方式3:对象名.getClass()
Employee employee = new Employee();
Class clazz = employee.getClass();
获取最基本信息
System.out.println(clazz.getName());//类完整路径
System.out.println(Arrays.toString(clazz.getInterfaces()));//实现了哪些接口
System.out.println(clazz.getSimpleName());//类名
System.out.println(clazz.getSuperclass());//父类的类对象
System.out.println(clazz.getModifiers());//得到修饰符
System.out.println(Modifier.toString(clazz.getModifiers()));
调用有参/无参构造函数创建对象
//通过无参构造方法创建对象
Object obj = clazz.newInstance();
//通过有参构造方法创建对象
//从类对象中获取有参构造方法
Constructor cons = clazz.getDeclaredConstructor(int.class,String.class,double.class,int.class);
//使用反射创建对象
cons.setAccessible(true);//对于某些方法无法进行赋值时,可以使用这个方法达到赋值的目的
Object obj = cons.newInstance(1002,"食客",12,22);
获取属性
//从类对象中获取属性
Field field = clazz.getDeclaredField("deptno");
field.setAccessible(true);
field.set(obj,1024);
获取泛型
//获取method1方法参数中的泛型类型
Method m1 = clazz.getMethod("method1",Map.class,List.class,String.class);
//获取不带泛型的参数,如java.util.List
Type types [] = m1.getParameterTypes();
System.out.println(types.length);
for (int i = 0; i < types.length; i++) {
System.out.println(types[i]);
}
//获取带参泛型
Type[] paramTypes = m1.getGenericParameterTypes();
for(Type param : paramTypes){
System.out.println("泛型:");
System.out.println(param);
if (param instanceof ParameterizedType){
System.out.println("泛型参数:");
Type[] actualTypeArguments = ((ParameterizedType) param).getActualTypeArguments();
for (Type ata : actualTypeArguments){
System.out.println(ata);
}
}
}
反射的优缺点
反射的优点:
- 使用方便。
- 功能强大,打破了封装和泛型的规范。
反射的缺点:
- 运行慢。
- 打破规范。