JAVA反射————基础版
课堂思维导图:
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反射————基础版相关推荐
- java 反射基础知识
java 反射 基础知识 反射:reflection 反射关键类 java 反射部分应用 反射:reflection 在运行中分析类. 在运行中查看和操作对象. 基于反射自己创建对象. 调用不可以访问 ...
- java 反射基础 万字详解(Class-Constructor-Method-Field一条龙)
目录 前言 一.反射及其相关概念 1.什么是反射? 2.反射的用途: ①分析类: ②查看并使用对象: 3.反射的应用场景: 4.类加载器: 类的加载时机: 5.Class对象: 联系: 二.获取Cla ...
- 一篇文章弄懂Java反射基础和反射的应用场景
文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...
- java 反射基础_Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射.反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的 ...
- Java反射基础,代码示例
文章出处:https://blog.csdn.net/ylyang12/article/details/53469957 说明:本文,在转载时,对内容略作修改,更方便阅读,代码做了调试和格式整理,总之 ...
- java反射基础学习
1.什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java反射基础(三)--Methods对象的使用
Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法 ...
- Java反射基础(二)--Fileds对象的使用
在说Filed之前,我们先来了解一下Member接口. 反射中定义了一个接口 java.lang.reflect.Member . java.lang.reflect.Field, java.lang ...
- Java反射基础(一)--Class对象获取
Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...
- java反射基础_Java反射基础(一)--Class对象获取
ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...
最新文章
- css去掉a标签点击后的虚线框
- PJ:细菌挥发性物质和光合信号激活低铁响应途径
- python+OpenCV图像处理
- 闲鱼有流量,毒具特色,“全面”的转转如何突围?
- VTK:vtkCellCenters用法实战
- Android之上下文context
- python3语法糖_Python笔记3:语法糖
- 【New】简•导航 正式上线
- 使用winscp在从linux向windows传输文件
- 2014.10.18笔记
- (转)Linux命令grep
- 共享一个可用的谷歌相机
- CVPR2019| CVPR论文
- 开式系统管径推荐选型_列管式换热器选型设计计算
- JDK的安装及环境变量配置
- Python每输出n个换行
- 微信公众平台开发__导航
- c语言打印输出迷宫地图所有路径
- Java编写圆形三角形长方形等面积与周长
- Android开发 —— apk打包流程