Java的宝贝——反射
目录
一、什么是反射?
二、为什么要用反射?
三、什么是Class?
四、怎么获取Class对象?
1.创建一个要拿的类(Student.java)
2.拿到Class对象的三种方式
五、通过反射进行实例化对象
1.反射实例化
2.反射动态方法调用
3.反射读写属性
一、什么是反射?
反射是java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
二、为什么要用反射?
比如在java开发的时候,并不知道别人会用什么数据库,我们可以导包然后进行连接,这就是反射,所以运用反射就是为了更方便也更灵活。java没了反射就像鱼没了尾巴,所以一定要学号反射哦。
三、什么是Class?
就是编译之后加载到内存之后生成的相对应的对象就是Class对象,我们可以通过Class对象获取这个类所有的方法,属性等,比如:把硬盘上的class文件一旦加载到内存变成的对象,可以理解为Class其实是内存表现形式,或者说是模型
四、怎么获取Class对象?
1.创建一个要拿的类(Student.java)
package com.pf.mvcdemo.reflect;public class Student {private String sid;private String sname;public Integer age;static{System.out.println("加载进jvm中!");}public Student() {super();System.out.println("调用无参构造方法创建了一个学生对象");}public Student(String sid) {super();this.sid = sid;System.out.println("调用带一个参数的构造方法创建了一个学生对象");}public Student(String sid, String sname) {super();this.sid = sid;this.sname = sname;System.out.println("调用带二个参数的构造方法创建了一个学生对象");}@SuppressWarnings("unused")private Student(Integer age) {System.out.println("调用Student类私有的构造方法创建一个学生对象");this.age = age;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public void hello() {System.out.println("你好!我是" + this.sname);}public void hello(String name) {System.out.println(name + "你好!我是" + this.sname);}@SuppressWarnings("unused")private Integer add(Integer a, Integer b) {return new Integer(a.intValue() + b.intValue());}
}
2.拿到Class对象的三种方式
Class.forName(完整类名)
Class<Student> clazz = (Class<Student>)Class.forName("com.pf.mvcdemo.reflect.Student");
怎么拿到全系列名?(com.pf.mvcdemo.reflect.Student)
找到需要拿的类
右键找到下图就可以拿到了
类名.class
Class clazz02 = Student.class;
对象.getClass()
Student stu = new Student();
Class clazz03 = stu.getClass();
报黄线怎么办?
直接压制一下
输出结果:
五、通过反射进行实例化对象
1.反射实例化
- getConstructor
- getDeclaredConstructor
- newInstance
2.反射动态方法调用
- getMethod
- getDeclaredMethod
3.反射读写属性
- getDeclaredField
- getDeclaredFields
package com.pf.mvcdemo.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class Demo {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {//1.Class.forName 获取ClassClass<Student> clazz = (Class<Student>)Class.forName("com.pf.mvcdemo.reflect.Student");//2.类.classClass clazz02 = Student.class;//3.对象.getClass()Student stu = new Student();Class clazz03 = stu.getClass();System.out.println(clazz);System.out.println(clazz02);System.out.println(clazz03);//通过反射进行实例化对象//1.得到一个构造函数对象Constructor<Student> c1 = clazz.getConstructor();//2.获取一个实例Student stu01 = c1.newInstance();//3.加入数据stu01.setSname("猪猪侠");System.out.println(stu01);//有参的(一个)//String.class 获取string类型的构造函数Constructor<Student> c2 = clazz.getConstructor(String.class);Student stu02 = c2.newInstance("0001");stu02.setSname("小菲菲");System.out.println(stu02);//有参的(两个)Constructor<Student> c3 = clazz.getConstructor(String.class,String.class);Student stu03 = c3.newInstance("0002","呆呆");System.out.println(stu03);//私有的//加了Declared就可以拿到私有的Constructor<Student> c4 = clazz.getDeclaredConstructor(Integer.class);//设置成可以访问,不设置会报错c4.setAccessible(true);Student stu04 = c4.newInstance(18);System.out.println(stu04);//有参方法//getMethod("hello",可变参数) hello方法名Method method = clazz.getMethod("hello");stu04.setSname("光头强");//调用方法method.invoke(stu04);//无参方法Method method02 = clazz.getMethod("hello",String.class);method02.invoke(stu04, "熊大");//私有方法Method method03 = clazz.getDeclaredMethod("add",Integer.class, Integer.class);method03.setAccessible(true);//为什么要强转?因为是通过反射进行的,系统并不知道会返回什么类型int rv = (int)method03.invoke(stu04, 1,1);System.out.println(rv);Field f = clazz.getField("age");f.set(stu04, 78);System.out.println(stu04);//f.get(stu04):获取stu04对象上的f属性的方法System.out.println(f.get(stu04));Field f01 = clazz.getDeclaredField("sname");f01.setAccessible(true);f01.set(stu04, "熊二");System.out.println(stu04);}}
运行结果图:
为什么getConstructor()括号里的参数可以随意多少个?
因为他是可变参数,但是他有条件的——要么只有一个可变参数,要么有多个可变参数,如果有很多参数,只有一个可变参数,那么必须把可变参数放到最后
@CallerSensitivepublic Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException {checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);return getConstructor0(parameterTypes, Member.PUBLIC);}
今天就到这咯,下次见
Java的宝贝——反射相关推荐
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- JAVA基础--JAVA中的反射机制详解
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...
- java 有哪些反射机制_Java 的反射机制你了解多少?
不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...
- Java 中使用反射来创建对象、调用方法
Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形 假设已有下面的类: import java.l ...
- java swing jbutton_Java 反射
点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 1 前 言 本章为新手向零基础 Java 反射学习笔记. 截取部分本 ...
- JAVA注解和反射(笔记)
注解简介 Annotation是从JDK5.0开始引入的新技术). Annotation的作用 : 不是程序本身(可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如 ...
- 反射-获取java私有内部类反射类型、私有字段
获取JAVA私有内部类反射类型 方式一 Class.forName("外部类完整路径$内部私有类类名"); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.fo ...
- java注解的反射_Java注解与反射
概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...
- Java 高级特性 --- 反射
From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...
最新文章
- LeetCode实战:最长公共前缀
- 让手机跑SOTA模型快8倍!Facebook AI开源最强全栈视频库:PyTorchVideo!
- 活学活用流行的JavaScript库——《JavaScript实战》
- 共享文件迁移(fileserver)——从windows server 2003到windows server 2008
- 搭建apache 文档服务器 ubuntu
- 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美
- 【Java】猜数字小游戏
- 彻夜怒肝!SpringBoot+Sentinel+Nacos高并发已撸完,快要裂开了!
- 台式电脑如何重装系统windows10
- 无重复字符最长字串的滑动窗口结合哈希表解法(注释详尽)
- 小程序商城框架源码 小程序源码带前端+后台+数据库
- python 批量打开网页并截图_如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture...
- 2019年大数据发展将走向何方。
- 创建室内导航地图的9个步骤
- 遥感数据网站整理中......
- ShowWindow 显示窗口
- [周鸿祎] 与其苟且活着,不如奋起抗争
- Redis一问多答(必背篇)
- 技术交流:对于大流量的网站,如何解决访问量的问题
- Tomcat+Apache动静分离