目录

一、什么是反射?

二、为什么要用反射?

三、什么是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的宝贝——反射相关推荐

  1. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  2. JAVA基础--JAVA中的反射机制详解

    JAVA反射机制     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...

  3. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  4. Java 中使用反射来创建对象、调用方法

    Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形   假设已有下面的类: import java.l ...

  5. java swing jbutton_Java 反射

    点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 1 前  言 本章为新手向零基础 Java 反射学习笔记. 截取部分本 ...

  6. JAVA注解和反射(笔记)

    注解简介 Annotation是从JDK5.0开始引入的新技术). Annotation的作用 : 不是程序本身(可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如 ...

  7. 反射-获取java私有内部类反射类型、私有字段

    获取JAVA私有内部类反射类型 方式一 Class.forName("外部类完整路径$内部私有类类名"); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.fo ...

  8. java注解的反射_Java注解与反射

    概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...

  9. Java 高级特性 --- 反射

    From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...

最新文章

  1. LeetCode实战:最长公共前缀
  2. 让手机跑SOTA模型快8倍!Facebook AI开源最强全栈视频库:PyTorchVideo!
  3. 活学活用流行的JavaScript库——《JavaScript实战》
  4. 共享文件迁移(fileserver)——从windows server 2003到windows server 2008
  5. 搭建apache 文档服务器 ubuntu
  6. 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美
  7. 【Java】猜数字小游戏
  8. 彻夜怒肝!SpringBoot+Sentinel+Nacos高并发已撸完,快要裂开了!
  9. 台式电脑如何重装系统windows10
  10. 无重复字符最长字串的滑动窗口结合哈希表解法(注释详尽)
  11. 小程序商城框架源码 小程序源码带前端+后台+数据库
  12. python 批量打开网页并截图_如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture...
  13. 2019年大数据发展将走向何方。
  14. 创建室内导航地图的9个步骤
  15. 遥感数据网站整理中......
  16. ShowWindow 显示窗口
  17. [周鸿祎] 与其苟且活着,不如奋起抗争
  18. Redis一问多答(必背篇)
  19. 技术交流:对于大流量的网站,如何解决访问量的问题
  20. Tomcat+Apache动静分离

热门文章

  1. 历史风云大戏:大明王朝1566
  2. 家庭成员介绍html模板,幼儿园介绍家庭成员教案
  3. 高德地图自动获取当前位置可搜索可拖拽获得GPS和道路信息
  4. HTML-一些自己不常用但很有用的标签
  5. 经验整理-win10安装ubuntu18.04.2双系统(NVIDIA Geforce GTX 1060独显)
  6. css样式文件的引入方式
  7. OneNote for Windows 10 笔记丢失踩雷
  8. Frontiers in neuroscience: 网络游戏成瘾者额叶theta频段震荡活动的降低
  9. 应用回归分析(知识点整理)(一)
  10. 【软件设计】六大设计原则讲解