课堂思维导图:

1.什么是反射:

反射java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法。

2.类类:

获取类类的类对象的三种方式
 * 1、Class.forName
 * 2.类.class
 * 3.类类的类对象的类实例.getClass();

public static void main(String[] args) throws Exception {
//  student.classClass stuClz1 = Class.forName("com.pjl.reflect.Student");
//  通用查询Class stuClz2 =Student.class;
//  通用  Class stuClz3 =new Student().getClass();
}

3.反射实例化

3.1调用无参构造方法创建了一个学生对象

首先获取类对象

public static void main(String[] args) throws Exception {Class stuClz1 = Class.forName("com.pjl.reflect.Student");Student stu1= (Student) stuClz1.newInstance();stu1.hello();
}

其次调用无参构造方法对一个类进行实例化

展示效果:

如果不调用无参 否则会报:

解决方法:接一个无参构造

3.2怎么通过反射调用有参构造器?

  • 带一个参数的
public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");Constructor<Student> c= stuClz1.getConstructor(String.class);Student s= c.newInstance("s001");
}

用的是student类里的有参:

效果展示:

  • 带两个参数的
public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");Constructor<Student> c2= stuClz1.getConstructor(String.class,String.class);Student s2= c2.newInstance("s001","zs");
}

效果展示:

3.3比较getDeclaredConstructor和 getConstructor的区别

区别:getDeclaredConstructor:能获得私有和公有的

getConstructor:获得公有的构造器

举例:

首先我们先用getConstructor实验

public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");Constructor<Student> c3= stuClz1.getConstructor(Integer.class);Student s3= c3.newInstance(26);
}

会报错(没有匹配的方法 )

原因:无法获取私有的构造方法

那么换getDeclaredConstructor试验:

public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");Constructor<Student> c3= stuClz1.getDeclaredConstructor(Integer.class);Student s3= c3.newInstance(26);
}

也会报错(没有访问权限)

解决方法:    //打开权限

c3.setAccessible(true);

整体代码结合:

package com.pjl.reflect;import java.lang.reflect.Constructor;/*** 反射实例化* @author zjjt**/
public class Demo2 {
public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");System.out.println("=======================");Student stu1= (Student) stuClz1.newInstance();stu1.hello();System.out.println("=======================");//怎么通过反射调用有参构造器//  区别:  getDeclaredConstructor:能获得私有和公有的构造器      getConstructor:获得私有的构造器 Constructor<Student> c= stuClz1.getConstructor(String.class);Student s= c.newInstance("s001");System.out.println("=======================");Constructor<Student> c2= stuClz1.getConstructor(String.class,String.class);Student s2= c2.newInstance("s001","zs");System.out.println("=======================");Constructor<Student> c3= stuClz1.getDeclaredConstructor(Integer.class);c3.setAccessible(true);Student s3= c3.newInstance(26);}
}

效果展示:

4.反射方法调用

//        invoke  参数1:求实例,在这里指的是Student类实例
//                    参数2:当前被调用的方法,传递参数值
//        invoke的返回值,就是被反射调用的方法的返回值,如果被调用

package com.pjl.reflect;import java.lang.reflect.Method;public class Demo3 {public static void main(String[] args) throws Exception {Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");Student s=stuClz1.newInstance();System.out.println("=======================");Method m1= stuClz1.getDeclaredMethod("hello");System.out.println(m1.invoke(s));System.out.println("=======================");Method m2= stuClz1.getDeclaredMethod("hello",String.class);System.out.println(m2.invoke(s,"zs"));System.out.println("=======================");Method m3= stuClz1.getDeclaredMethod("add",Integer.class,Integer.class);m3.setAccessible(true);System.out.println(m3.invoke(s,10,5));}
}

效果展示:

5.反射读写属性

package com.pjl.reflect;import java.lang.reflect.Field;/*** 反射读取属性* @author zjjt**/
public class Demo4 {public static void main(String[] args) throws Exception {//获取类对象Class<Student> stuClz1 = (Class<Student>) Class.forName("com.pjl.reflect.Student");//获取类对象的属性Student s=stuClz1.newInstance();System.out.println("=======================");Field f= stuClz1.getDeclaredField("sname");f.setAccessible(true);//反射写属性f.set(s,"zs");System.out.println(s.getSname());//反射读属性System.out.println(f.get(s));System.out.println("=======================");//比较oop与反射读取属性值的方式Student st=new Student("s002","ls");st.age=22;System.out.println(st.getSid());System.out.println(st.age);System.out.println("=======================");//反射读取该对象所有属性值Field[] fields= stuClz1.getDeclaredFields();for (Field ff: fields) {ff.setAccessible(true);System.out.println(ff.getName()+":"+ff.get(st));}}
}

展示效果:

总结:反射是框架设计的灵魂!

JAVA反射————基础版相关推荐

  1. java 反射基础知识

    java 反射 基础知识 反射:reflection 反射关键类 java 反射部分应用 反射:reflection 在运行中分析类. 在运行中查看和操作对象. 基于反射自己创建对象. 调用不可以访问 ...

  2. java 反射基础 万字详解(Class-Constructor-Method-Field一条龙)

    目录 前言 一.反射及其相关概念 1.什么是反射? 2.反射的用途: ①分析类: ②查看并使用对象: 3.反射的应用场景: 4.类加载器: 类的加载时机: 5.Class对象: 联系: 二.获取Cla ...

  3. 一篇文章弄懂Java反射基础和反射的应用场景

    文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...

  4. java 反射基础_Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射.反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的 ...

  5. Java反射基础,代码示例

    文章出处:https://blog.csdn.net/ylyang12/article/details/53469957 说明:本文,在转载时,对内容略作修改,更方便阅读,代码做了调试和格式整理,总之 ...

  6. java反射基础学习

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

  7. Java反射基础(三)--Methods对象的使用

    Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法 ...

  8. Java反射基础(二)--Fileds对象的使用

    在说Filed之前,我们先来了解一下Member接口. 反射中定义了一个接口 java.lang.reflect.Member . java.lang.reflect.Field, java.lang ...

  9. Java反射基础(一)--Class对象获取

    Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...

  10. java反射基础_Java反射基础(一)--Class对象获取

    ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...

最新文章

  1. css去掉a标签点击后的虚线框
  2. PJ:细菌挥发性物质和光合信号激活低铁响应途径
  3. python+OpenCV图像处理
  4. 闲鱼有流量,毒具特色,“全面”的转转如何突围?
  5. VTK:vtkCellCenters用法实战
  6. Android之上下文context
  7. python3语法糖_Python笔记3:语法糖
  8. 【New】简•导航 正式上线
  9. 使用winscp在从linux向windows传输文件
  10. 2014.10.18笔记
  11. (转)Linux命令grep
  12. 共享一个可用的谷歌相机
  13. CVPR2019| CVPR论文
  14. 开式系统管径推荐选型_列管式换热器选型设计计算
  15. JDK的安装及环境变量配置
  16. Python每输出n个换行
  17. 微信公众平台开发__导航
  18. c语言打印输出迷宫地图所有路径
  19. Java编写圆形三角形长方形等面积与周长
  20. Android开发 —— apk打包流程

热门文章

  1. Ubuntu18网络配置
  2. MATLAB绘图总结
  3. RobotFramework与Eclipse集成
  4. SECS/GEM编程
  5. Docker 加速器
  6. python九宫格拼图游戏
  7. 中控考勤机重置考勤机密码方法
  8. 北理慕课——Python文件和数据格式化
  9. 算法解析——矩阵快速幂
  10. 操作无法完成因为其中的文件夹或文件已在另一个程序中打开