eclipse反射原理及运用
文章目录
- 什么是反射?
- 运用
- 1,类对象
- 一,通过对应类(java.lang.Class)实例的类(Student.Class)实例getClss()方法获取 (通用增删改时用到)例:
- 二,通过Class.forName("类的全路径"); JDBC的驱动加载就用到反射技术。 例:
- 三,类实例.Class(通用查询用到)例:
什么是反射?
运用Eclipse官方的一句话:反射是java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法。
说到实例化对象读写属性,大家都会想到的是运用java语言的封装特点。但大家有没有想过不用封装方法就能调用内部的属性和方法呢?接下来为大家讲解,通过反射也是可以调用的!
运用
1,类对象
什么是类对象?就好比一条狗,他是狗类,他叫狗蛋,那么他就是狗类的对象。要进行反射的第一步,必须先获得类对象的类对象!
何为类对象的类对象,也就是把所有的类对象集合到一起,看作是一类,称为类对象的类对象。
获得类对象一般有三种方法,都各有各自的用途。
一,通过对应类(java.lang.Class)实例的类(Student.Class)实例getClss()方法获取 (通用增删改时用到)例:
Student stu = new Student(); Class clz = stu.getClass();
二,通过Class.forName(“类的全路径”); JDBC的驱动加载就用到反射技术。 例:
Class clz = Class.forName("caom.zking.reflect.Student");
三,类实例.Class(通用查询用到)例:
Class clz = Student.class;
2,运用反射来实例化对象
通常 运用到反射的好处就是能够将未知的类进行实例化。若找不到所写的类则报ClassNotFoundException错误。
下面介绍几种情况下如何实例化对象:
一,通过反射的方式调用无参构造器来实例化对象
这种方式属于临时的实例化,而且这里他就会自动调用Student这个类的无参构造,可用syso进行输出测试。
Class clz = Student.class;Student stu = (Student) clz.newInstance();
二,通过反射的方式调用带有参数的构造器来实例化对象
Class clz = Student.class;//这里的参数指的是你在这个类中写的参数类型,若有多个用逗号隔开 Constructor c = clz.getConstructor(String.class); //这里面的参数和上面相对应,写的是你实例化对象的属性值,若有多个用逗号隔开 Student stu = (Student) c.newInstance("s001");
三,通过反射的方式调用私有的构造器来实例化对象
和上面的不同,因为是私有的,通过getConstructor()这个方法是获取不到的。因此,有另外一种方法获取。
例:
Constructor c = clz.getDeclaredConstructor(Integer.class); //这是设置可以请求,private默认设置的是false c.setAccessible(true); Student stu = (Student)c.newInstance(12);
getConstructor 和 getDeclaredConstructor 的区别在于
getConstructor()可以获取到的是public修饰的。
getDeclaredConstructor()可以获取到的是所有的构造器。
3,运用反射调用动态方法
通过这个方法,可以获取到某类的方法。
一,无参的
例:
Class clz = Student.class;//第一个参数指的是,类类的类实例的类实例 Method m = clz.getDeclaredMethod("hello"); //Method类invoke方法的返回值就是被调用的方法的返回值 //如果被调用的方法不具备返回值,则返回null Object invoke = m.invoke(clz.newInstance());
二,有参的
例:
Class clz = Student.class;//第二个参数指的是,调用方法所携带的参数,若有多个则用逗号隔开 Method m = clz.getDeclaredMethod("hello", String.class); Object stu = m.invoke(clz.newInstance(), "XXX");
三,私有的
例:
Class clz = Student.class;Method m = clz.getDeclaredMethod("add", Integer.class,Integer.class); //与其他不同之处在于要设置默认请求开关 m.setAccessible(true); //参数与上文同理 Object invoke = m.invoke(clz.newInstance(),2,5);
4,反射读写属性
一,读取属性
1,获得所有属性
例:
Class clz = stu.getClass(); //获取所有的属性,所有用集合装起来 Field[] fields = clz.getDeclaredFields(); //遍历 for (Field field : fields) { //这个是设置私有的属性值能够显示出来,不然会报java.lang.IllegalAccessException 错误 field.setAccessible(true); //field.getName()是获取属性名,field.get(stu)则是获取属性对应的值,参数放的是你要获取参数的对象 System.out.println(field.getName()+":"+field.get(stu)); }
2,获得单个属性
例:
Class clz = stu.getClass(); //参数写的是你要获取的属性值名称 Field field = clz.getDeclaredField("age"); System.out.println(field.getName()+":"+field.get(stu));
二,设置属性值
1,设置public修饰的(公有)属性
Student stu = new Student(); Class clz = stu.getClass(); //同上运用获取单个属性方法 Field field = clz.getDeclaredField("age"); //通过set()方法设置值 field.set(stu, 45); System.out.println(stu.age);
2,设置private修饰的(私有)属性
Student stu = new Student(); Class clz = stu.getClass(); //同上运用获取单个属性方法 Field field = clz.getDeclaredField("sname"); //与之不同的是多了个设置默认可请求 field.setAccessible(true); field.set(stu,"ccc"); System.out.println(stu.getSname());
5,访问修饰符 getModifiers()
在很多情况下都会想知道此方法或者属性值的修饰符,这就运用到了getModifiers()这个方法了
getModifiers()返回的
4000
值是二进制数字组成,若只有单个则单个输出。
例若修饰符只有public那么返回的是1.
若修饰符只有private那么返回的是2。
若有组合,例public final …那么就像二进制一样的数字,有兴趣的可以百度了解~
- SSM 实训笔记 -02- Class.forName 运用反射的原理创建对象
- 运用反射原理 + POI工具写一个java接口doc工具 (扫描包下接口并生成简单接口文档)
- 黑马程序员-对eclipse代码补全功能原理的猜想及实验(对反射技术的一些使用)
- 运用反射原理的简单工厂模式和运用反射原理从数据库里读出数据直接封装到实体集合里
- 团队开发项目 特点一 运用物理学反射原理
- SSH原理与运用(二):远程操作与端口转发
- c#用反射原理递归遍历复杂实体对象
- 关于javabean的一反射原理
- SSH原理与运用
- Java反射原理极其实战
- [Spring] IOC的实现原理—反射与工厂模式
- Eclipse的一些运用
- 代码解释:java反射调用的原理
- 重构:运用Java反射加多态 “干掉” switch
- Atitit spring原理 反射 ioc 与注解api 目录 1. 反射的使用 1 1.1. 使用jdk原生反射api 1 1.2. 使用apache 工具包 commons-beanutil
- 反射运用之Object和Map转换
- Java 反射学习(四)反射技术开发框架原理简单实现
- SSH原理与运用(二):远程操作与端口转发
- java的反射原理
- java反射运用