SentralLiu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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();
	}

posted on 2021-11-16 19:24  SentralLiu  阅读(16)  评论(0)    收藏  举报