反射API的使用

反射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);
                }
            }
        }

反射的优缺点

反射的优点:

  1. 使用方便。
  2. 功能强大,打破了封装和泛型的规范。

反射的缺点:

  1. 运行慢。
  2. 打破规范。

Guess you like

Origin blog.csdn.net/qq_44157349/article/details/114817869