Java的反射基础技术
今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!!
什么是反射?
反射它是根据字节码文件可以反射出类的信息、字段、方法、构造方法等内容,还可以创建对象调用方法,我们称它为反射技术。
如何通过反射获取Class对象了?
它有三种方法,1.通过Class获取类对象
2.通过getClass()方法获取类对象
3.通过Class.forName(“完整类名”)获取类对象
案例:通过反射获得Class对象的3种方法
Class c1 = ReflectionBasic.class;
Class c2 = new ReflectionBasic().getClass();
Class c3 = Class.forName("reflection.getClassObject.ReflectionBasic"); System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
运行结果:

注意:Class.forName()它除了能获取Class对象,还可以将获取的类对象自动加载到JVM虚拟机的内存中去 ,下面案例的运行结果可以看出代码输出的static静态代码块一个泛型的C4和C5对象,可是只有C5输出了static,这就说明了使用Class.forName()可以将类对象加载到JVM虚拟机的内存中去。
案例:
//通过输出OtherTest反射对象
Class<?> c4 = OtherTest.class;
System.out.println("此输出对象是C4==============================="+c4);
Class<?> c5 = Class.forName("reflection.getClassObject.OtherTest");
System.out.println("此输出对象是C5==============================="+c4);
class OtherTest{
static {
System.out.println("你好呀!!!宝宝们!!!");
}
}
运行结果:

获取反射类的信息
在java.lang.reflect包下有很多反射类信息的类
反射类的信息
接口类:
public interface IReflection {
}
父类:
public class Reflection {
}
主类:
public class ReflectionInfo extends Reflection implements IReflection {
public static void main(String[] args) {
//创建类的对象
Class<?> c1 = ReflectionInfo.class;
//获取反射ReflectionInfo类的================================修饰符
int modifiers = c1.getModifiers();//得到的是一个整数那么我们就需要转换了
System.out.println(modifiers);
String sModifiers = Modifier.toString(modifiers);//转换后得到的信息
System.out.println(sModifiers);
System.out.println("以上是获取反射ReflectionInfo类的================================修饰符");
//获取反射ReflectionInfo类的================================完整类名
String name = c1.getName();
System.out.println(name);
//获取反射ReflectionInfo类的================================简易类名
String simpleName = c1.getSimpleName();
System.out.println(simpleName);
System.out.println("以上是获取反射ReflectionInfo类的================================完整类名和简易类名");
//获取反射ReflectionInfo类的================================完整父类名
Class<?> superclass = c1.getSuperclass();
System.out.println(superclass.getSuperclass());
//获取反射ReflectionInfo类的================================简易父类名
System.out.println(superclass.getSimpleName());
System.out.println("以上是获取反射ReflectionInfo类的================================完整父类名和简易父类名");
//获取反射ReflectionInfo类的================================接口,由于接口可以是多个我们需要通过遍历来输出出来
Class<?>[] interfaces = c1.getInterfaces();
if(interfaces.length>0){
for (int i = 0; i < interfaces.length;i++){
//获取反射ReflectionInfo类的================================完整接口名
System.out.println(interfaces[i]);
//获取反射ReflectionInfo类的================================简易接口名
System.out.println(interfaces[i].getSimpleName());
}
}
}
}
运行结果:

通过反射技术访问字段(分private和public修饰)
错误案例:通过getFile()方法得到private属性的值,会报错
public class AccessFiled {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
//创建Class对象
Class<?> c1 = Company.class;
//返回返回的公共字段public
Field field = c1.getField("name");
//通过反射技术创建对象实例,默认调用无参构造哦
Object obj = c1.newInstance();//此方法相当于new一个Company对象
field.set(obj,"无名公司"); //设置name的字段值
System.out.println(obj);
System.out.println(field.get(obj));//输出name的字段值
//返回返回的公共字段public
Field fields = c1.getField("id");
//通过反射技术创建对象实例,默认调用无参构造哦
field.set(obj,"00001"); //设置name的字段值
System.out.println(field.get(obj));//输出name的字段值
}
}
class Company{
public String name;
private int id;
}
运行结果:

正确案例:使用getDeclaredField()方法得到private修饰的id值,这个是可以得到任意修饰符修饰的字段
public class AccessFiled {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
//创建Class对象
Class<?> c1 = Company.class;
//返回返回的公共字段public
Field field = c1.getField("name");
//通过反射技术创建对象实例,默认调用无参构造哦
Object obj = c1.newInstance();//此方法相当于new一个Company对象
field.set(obj,"无名公司"); //设置name的字段值
System.out.println(obj);
System.out.println(field.get(obj));//输出name的字段值
//返回返回的公共字段public
Field fields = c1.getDeclaredField("id");
//通过反射技术创建对象实例,默认调用无参构造哦
field.set(obj,"00001"); //设置name的字段值
System.out.println(field.get(obj));//输出name的字段值
}
}
class Company{
public String name;
private int id;
}
运行结果:

通过反射技术调用方法
public class CallObject {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//创建Class对象
Class<?> c1 = Company.class;
//反射shou()方法
Method method = c1.getMethod("show", null);//前面的参数是方法名。后面的是方法的返回值类型
//通过反射创建实例
Object obj = c1.newInstance();
System.out.println("无参==========="+method.invoke(obj,null ));
System.out.println(obj);
Method shous = c1.getMethod("shows",String.class);
shous.invoke(obj,"无名公司");
//反射shows()方法带(参数列表类型)
System.out.println("有参==========="+obj);;
}
}
class Company{
public String name;
private int id;
public void show(){
System.out.println("show=====方法");
}
public void shows(String name){
System.out.println("shows======方法");
this.name = name;
}
@Override
public String toString() {
return "Company{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
运行结果:

Java的反射基础讲解完毕,又不懂或者不理解的可以在评论区给本人留言,我会及时回复大家的。
Java的反射基础技术的更多相关文章
- Java Reflection 反射基础
反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...
- 【已转移】【Java架构:基础技术】一篇文章搞掂:Java 8
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.Java的历史与演变 目的:为完全了解Java,需要理解Java的诞生原因.成型动力以及他继承的思想. 计算机语言的创新与发展 ...
- 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...
- Java核心技术卷一基础技术-第13章-集合-读书笔记
第13章 集合 本章内容: * 集合接口 * 具体的集合 * 集合框架 * 算法 * 遗留的集合 13.1 集合接口 Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制. 13. ...
- 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...
- 【Java架构:基础技术】一篇文章搞掂:MyBatis-Plus
前言 Mybatis:一个流行的半自动ORM框架. Mybatis-Plus:一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发.提高效率而生. 本文使用的版本:myb ...
- 【Java架构:基础技术】一篇文章搞掂:MyBatis
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文主要总结于刘增辉的<MyBatisc从入门到精通>一书,有兴趣的朋友可以自行研读 建议仔细研读官方文档: http ...
- 【Java架构:基础技术】一篇文章搞掂:Gradle
前言 Gradle是什么: Gradle提供了一个域特定语言(DSL),用于描述构建 它使用 Groovy 语言,使其更容易来形容和构建 Gradle 中的每一个构建脚本使用UTF-8进行编码保存,并 ...
- 【Java架构:基础技术】一篇文章搞掂:Maven
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文基于<Maven 实战>一书进行总结和扩展,大家也可以自行研读此书. 一.Maven简介 1.1.什么是Maven ...
随机推荐
- 图论初步-Tarjan算法及其应用
暑假刷了一堆Tarjan题到头来还是忘得差不多. 这篇博客权当复习吧. 一些定义 无向图 割顶与桥 (划重点) 图G是连通图,删除一个点表示删除此点以及所有与其相连的边. 若删除某点u后G不再连通,那 ...
- 吴裕雄--天生自然python学习笔记:Python MySQL - mysql-connector 驱动
本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器. 我们可以使用 pip 命令来安装 mysql-c ...
- .net和JAVA面向对象,继承有趣的细节
原型是同事间讨论的一道面试题.估计这题秒杀了不少人,LZ也被秒了. 但这个题里隐藏了一个很有趣的细节,这个细节不说清楚,不少人会其实死的冤枉. 这是C#的代码. class Program { sta ...
- SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理
SpringMVC的异常处理,SimpleMappingExceptionResolver只能简单的处理异常 当发生异常的时候,根据发生的异常类型跳转到指定的页面来显示异常信息 ExceptionCo ...
- 你相信吗:新药可以让X战警变成现实
不管男人还是女人.大人还是小孩,心目中都有一个超级英雄梦,梦想着有一天能够具有超级英雄的能力.直到今天,你相信吗?现在医学工作者已经发现通过一种新药可以让人拥有X战警里一些超级英雄的能力 ...
- RocketMQ集群平滑下线或重启某个节点
1.现状描述 集群其中一台物理机未知原因导致单用户无法登陆机器,该物理机需要重启修改密码或者重装系统.该台为master节点,运行正常.配置策略为: 异步刷盘 主从异步复制 如果直接下线该master ...
- Centos 7 安装Mysql8 主从同步复制
环境:Centos 7 软件:Mysql8 安装方式:Yum 1.从官网下载最新yum 源对应Cenots 7 版本安装: [root@DataNode-03 ~]# yum -y localinst ...
- 何用Java8 Stream API进行数据抽取与收集
上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...
- 压力测试(七)-html可视化压测报告细讲
1.阿里云Linux服务器 Jmeter压测实战之jtl文件生成和查看 简介: 利用软件从阿里云Centos服务器下载压测报告,讲解Jtl文件,并怎么查看文件 可以通过打开jmeter,新建线程组-& ...
- 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...