简介:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
反射概念(简单):
反射机制也被应用到了视窗系统、操作系统和文件系统中。 Java中,反射是一种强大的工具。它使你能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。
1.什么是反射?
反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。
2、反射机制的优缺点?
优点:能够运行时动态获取类的实例,提高灵活性;可与动态编译结合
缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析。
3、Java反射API有几类?
反射 API 用来生成 JVM 中的类、接口或则对象的信息。
Class 类:反射的核心类,可以获取类的属性,方法等信息。
Field 类:Java.lang.reflec包中的类,表示类的成员变量,可用来获取和设置类之中的属性值。
Method 类:Java.lang.reflec包中的类,表示类的方法,可用来获取类中的方法信息或者执行方法。
Constructor 类:Java.lang.reflec包中的类,表示类的构造方法。
4.如何得到类对象
一切反射相关的代码都从获得类对象开始
3种获取方式:
1 类名.class;
2 对象名.getClass();
3 Class.forName(全限定名/全路径名)
//反射方式
Class cls = Class.forName("com.reflect.entity.Hello");
Object hello1 = cls.newInstance();
//3.一切与反射相关的操作都从获取类对象开始。
//1)类名.class
//Class cls=Hello.class;
//2)实例化对象名.getClass()
//Class cls = hello.getClass();
//3)Class.forName(类的全路径名/全限定名)
//Class cls = Class.forName("com.reflect.entity.Hello");
System.out.println("获取类的全路径名:"+cls.getName());
System.out.println("获取简单类名:"+cls.getSimpleName());
System.out.println("获取访问修饰符:"+cls.getModifiers());
System.out.println("获取包名:"+cls.getPackage());
根据类得到类名(全限定名/全路径名)
获取全限定名:cls.getName();
获取类名:cls.getSimpleName();获取访问修饰符:cls.getModifiers();
获取包名 : cls.getPackage();
反射机制实例化对象
//获取类对象 Class cls=Student.class; //反射机制实例化对象 Student stu = (Student) cls.newInstance();
5、根据类得到类的属性 (读写属性(Field))
语法格式:Field field=cla.getField(“属性名”);
案例展示:
//1)获取单个公共的属性
//Field field = cls.getField("age");
//2)获取单个公共的、私有的、最终的等等属性
//属性的访问修饰符1:代表public 2:代表private 0:代表没有修饰符
//Field field = cls.getDeclaredField("age");
//3)获取所有公共的属性
//Field[] fields = cls.getFields();
//然后foreach
//4)获取所有公共的、私有的、受保护的、最终的等等属性
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
System.out.println("获取属性名:"+field.getName());
System.out.println("获取属性的访问修饰符:"+field.getModifiers());
System.out.println("获取属性类型:"+field.getType());
}
获取属性名:field.getName();
获取属性类型: filed.getType();
获取属性访问修饰符 :field.getModifiers();
6、根据类得到类的方法(调用方法及构造函数)
//有参有返回、有参无返回;无参有返,无参无返回
//1)获取单个公共的方法
//参数1:Student中给定的方法,无参
//Method method = cls.getMethod("hello", null);
//2)获取单个公共的、私有的、最终的等等方法
//Method method = cls.getDeclaredMethod("add",Integer.class, Integer.class);
//3)获取所有公共的方法
//Method[] methods = cls.getMethods();
//foreach
//4)获取所有公共的、私有的、受保护的、最终的等等方法
//5)调用方法
//Method method = cls.getMethod("hello", null);//无参
//Method method = cls.getMethod("hello", String.class);//有参
//执行方法
// Object returnValue = method.invoke(stu, "黄名季");
// System.out.println(returnValue);
获取方法名:method.getName();
获取访问修饰符:method.getModifiers();
获取参数数量:method.getParameterCount();
获取返回类型:method.getReturnType();
赋值 取值
//赋值 //取值 //参数1:实例化对象名
7、根据类得到类的实现接口列表
Class[] interface=cla.getInterfaces(); //获取类对象中所有实现接口列表
8、调用构造函数
Constructor con=cls.getDeclaredConstructor(Integer.class); //权限设置 con.setAccessible(true); con.newInstance(18);
Question:传统实例方式与反射方式的区别?
传统实例方式:实例化对象就是生成的对象,在Java通过new关键字来实例化一个对象
例如:Hello hello = new Hello();
反射方式:反射机制是Java语言特有的,它最主要的作用是为了运行期间得到对象的结构(包括成员变量,方法,构造方法等),并可以在允许的情况下访问这些属性和方法。
//获取类对象
Class cls=Student.class;
//反射机制实例化对象
Student stu = (Student) cls.newInstance();



