反射
1.什么是反射?
反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
2. 类类
所有狗 狗类 Dog 狗对象 二哈
所有猫 猫类 Cat 猫对象 肥波
所有类 类类 java.lang.Class 类对象 特定类
3.如何得到类对象(重点中的重点)
一切反射相关的代码都从获得类对象开始3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名)(最常用)
代码:
// java反射 是java中的一种重要的机制 // 可以动态的实例化对象,读写属性,调用方法 //一切反射相关的代码都从获得类对象开始 //获取类对象的方式 //1.类名.class Student stu = new Student() Class clazz = Student.class; System.out.println(clazz); //2.对象名.getClass(); Student stu = new Student(); System.out.println("-----------------------"); Class clazz1 = stu.getClass(); System.out.println(clazz1); //3.Class.forName(全限定名)(最重要) System.out.println("----------------------"); Class clazz2 = Class.forName("com.zking.refletion.Student"); System.out.println(clazz2);
效果图:
4.根据类得到类名(全限定名/全路径名)
1)cName.getName(); -->获取全限定名
2)cName.getSimpleName(); -->获取类名
3)cName.getPackage(); -->获取包名
4)== ------->获取对象是否相等
//同一个对象true,不是一个地址为false System.out.println(clazz==clazz1); //获取类名 System.out.println(clazz.getSimpleName()); //获取具体的类名路径 System.out.println(clazz.getTypeName()); //获取包名 System.out.println(clazz.getPackage());
效果图:
注意点:
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一
5.根据类得到类的属性
① Field field=cla.getField(“属性名”);
②field.getName(); -->获取属性名
③filed.getType(); -->获取属性类型
④field.getModifiers(); -->获取属性访问修饰符
⑤ field.set(Object,Object); -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;
⑥field.get(Object); -->获取属性值,参数:要获取属性值的对象
⑦clazz.getDeclaredField(“属性名”); -->获取单个属性(私有、公有、受保护、默认、静态)
⑧clazz.getDeclaredFields(); -->获取所有属性(私有、公有、受保护、默认、静态)
代码:
package com.zking.refletion; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Demo03 { public static void main(String[] args) throws Exception { // java反射 是java中的一种重要的机制 // 可以动态的实例化对象,读写属性,调用方法 //一切反射相关的代码都从获得类对象开始 //获取类对象的方式 //3.Class.forName(全限定名)(最重要) Class clazz = Class.forName("com.zking.refletion.Student"); Student stu = (Student)clazz.newInstance(); //读写属性 //1.获取属性对象 Field field = clazz.getDeclaredField("path"); //2.打开访问限制 field.setAccessible(true); //3.写属性 // field.set(stu, "p007"); //4.读属性 // Object object = field.get(stu); } }