搞懂反射我建议选这篇

反射

    • 介绍
    • Class类
    • 创建对象
      • 测试代码
      • 运行结果
    • 属性
      • 测试代码
      • 运行结果
    • 构造方法
      • 测试代码
      • 运行结果
    • 成员方法
      • 测试代码
      • 运行结果
  • 用到的全部代码
    • student类
    • 运行的全部代码

介绍

Reflection(反射) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查。被private封装的资源只能类内部访问,外部是不行的,但反射能直接操作类私有属性。

反射可以在运行时获取一个类的所有信息,(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。通俗点总结就是不通过创建对象的方式来访问类的属性,并且能够访问private修饰的属

性。

Class类

Java反射的基础是Class类,它是Java反射的入口。Class类提供了获取类的构造函数、方法、字段、注解等信息的方法。

创建对象

Class.forName(“类的全路径”)( 例如:com.hqyj.core.io.serializestream.Student)

类名.class

类的对象.getClass();( 不建议)

测试代码

public static void test01() throws Exception{//反射,拿到了类的所有信息,可以走后门//方式一//创建类的Class对象System.out.println("===================================");System.out.println("方式一");Class c1=Class.forName("com.HQSecond.day9.Student");//创建Student对象Student stu1=(Student) c1.newInstance();System.out.println(stu1);System.out.println("===================================");System.out.println("方式二");Class c2=Student.class;Student stu2=(Student) c2.newInstance();System.out.println(stu2);System.out.println("===================================");System.out.println("方式三");Class c3=new Student().getClass();Student stu3=(Student) c3.newInstance();System.out.println(stu3);}

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LLmwLOv-1688183743916)(E:\myapp\typora\笔记文件夹\java第二阶段\imgs-2\创建对象测试结果.png)]

属性

Fields[] fields; (存储的是类的成员变量)getField() 根据名字获取public修饰的变量
getFields() 返回类中public修饰的成员变量
getDeclaredField()  根据名字获取所有变量
getDeclaredFields()  返回类中所有的成员变量

测试代码

        public static void test02() throws Exception{//创建类的Class对象Class c1=Class.forName("com.HQSecond.day9.Student");//创建Student对象Student stu1=(Student) c1.newInstance();//根据指定名字获取成员变量Field对象中包含了变量的属性(权限修饰符、类型、名字)System.out.println("=========================================");System.out.println("根据指定名字获取成员变量:");Field  f= c1.getField("name");System.out.println("变量的名称:"+f.getName());System.out.println("变量的类型:"+f.getType().getName());System.out.println("=========================================");System.out.println("获取类中所有public成员变量:");Field[] fields = c1.getFields();for (Field f1:fields) {System.out.print(f1.getName()+"     ");System.out.println(f1.getType());}System.out.println("=========================================");System.out.println("获取类中所有成员变量:");Field[] fields1 = c1.getDeclaredFields();for (Field f1 : fields1) {System.out.print(f1.getName()+"     ");System.out.println(f1.getType());}System.out.println("=========================================");System.out.println("给指定的变量赋值:");System.out.println("public变量:");Field f2 = c1.getDeclaredField("name");f2.set(stu1,"Bob");//赋值System.out.println(stu1.getName());//获取System.out.println("private变量:");Field f4 = c1.getDeclaredField("sex");给private修饰的变量赋值,需要设置暴力反射f4.setAccessible(true);f4.set(stu1,"male");//赋值System.out.println(stu1.getSex());//获取}

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0fMArB7-1688183743918)(E:\myapp\typora\笔记文件夹\java第二阶段\imgs-2\反射变量测试.png)]

构造方法

Constructors[] constructors;(存储的是类的构造方法)getConstructors();获取类中的所有构造方法getConstructor();获取无参的构造方法getConstructor(String.class, int.class, char.class);
获取有参的构造方法,表明第一个参数为String类型,第二个为int类,第三个为char

测试代码

 public static void test03() throws Exception{//方式二 创建class对象Class c1=Student.class;System.out.println("=========================================");System.out.println("获取类中的构造方法:");Constructor[] cons = c1.getConstructors();for (Constructor con : cons) {System.out.println(con);}System.out.println("=========================================");System.out.println("获取无参的构造方法,创对象:");//获取无参的构造方法 创对象---->调用构造方法 调用构造方法----->创对象Constructor con1 = c1.getConstructor();//通过无参构造方法创建Student对象Student Stu1=(Student)con1.newInstance();System.out.println(Stu1);System.out.println("=========================================");System.out.println("获取有参的构造方法,创对象:");//获取有参的构造方法Constructor con2 = c1.getConstructor(String.class, Integer.class);// 通过有参构造创建对象Student stu2=(Student)con2.newInstance("大黄",5);System.out.println(stu2);System.out.println("=========================================");System.out.println("获取有参的构造方法,创对象:");Constructor con3 = c1.getConstructor(String.class, Integer.class,String.class,String.class);Student stu3=(Student)con3.newInstance("Alice",18,"female","ball");System.out.println(stu3.toString());}

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtWz6327-1688183743918)(E:\myapp\typora\笔记文件夹\java第二阶段\imgs-2\反射构造方法测试.png)]

成员方法

Methods[] methods;(存储的是类的成员方法)getMethod("eat", String.class);(参数1:方法的名称, 参数2:方法形参类型)

测试代码

  public static void test04()throws Exception{Class c= Class.forName("com.HQSecond.day9.Student");Student Stu1=(Student)c.newInstance();Stu1.name="Jack";//通过反射调用类中的成员方法   参数1:方法的名称, 参数2:方法形参类型Method m = c.getMethod("getName");//执行方法,传递参数System.out.println(m.invoke(Stu1));//测试2 用set方法设置,get方法获取Method m1 = c.getMethod("setHobby", String.class);m1.invoke(Stu1,"ball");Method m2 = c.getMethod("getHobby");System.out.println(m2.invoke(Stu1));}

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yXZslo2-1688183743918)(E:\myapp\typora\笔记文件夹\java第二阶段\imgs-2\反射方法测试.png)]

用到的全部代码

student类


import java.io.Serializable;public class Student implements Serializable {//成员变量//声明一个固定的序列号,此时无论去改变类,序列号都不会变。public static final long serialVersionUID=12345;public String name;public Integer age;private String sex;protected String hobby;//构造方法public Student(){}public Student(String name, Integer age) {this.name = name;this.age = age;}public Student(String name, Integer age, String sex) {this.name = name;this.age = age;this.sex = sex;}public Student(String name, Integer age, String sex, String hobby) {this.name = name;this.age = age;this.sex = sex;this.hobby = hobby;}//成员方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public static long getSerialVersionUID() {return serialVersionUID;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +", hobby='" + hobby + '\'' +'}';}
}

运行的全部代码

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class ReflectTest {public static void main(String[] args) throws Exception {test01();test02();test03();test04();}public static void test01() throws Exception{//反射,拿到了类的所有信息,可以走后门//方式一//创建类的Class对象System.out.println("===================================");System.out.println("方式一");Class c1=Class.forName("com.HQSecond.day9.Student");//创建Student对象Student stu1=(Student) c1.newInstance();System.out.println(stu1);System.out.println("===================================");System.out.println("方式二");Class c2=Student.class;Student stu2=(Student) c2.newInstance();System.out.println(stu2);System.out.println("===================================");System.out.println("方式三");Class c3=new Student().getClass();Student stu3=(Student) c3.newInstance();System.out.println(stu3);}public static void test02() throws Exception{//创建类的Class对象Class c1=Class.forName("com.HQSecond.day9.Student");//创建Student对象Student stu1=(Student) c1.newInstance();//根据指定名字获取成员变量Field对象中包含了变量的属性(权限修饰符、类型、名字)System.out.println("=========================================");System.out.println("根据指定名字获取成员变量:");Field  f= c1.getField("name");System.out.println("变量的名称:"+f.getName());System.out.println("变量的类型:"+f.getType().getName());System.out.println("=========================================");System.out.println("获取类中所有public成员变量:");Field[] fields = c1.getFields();for (Field f1:fields) {System.out.print(f1.getName()+"     ");System.out.println(f1.getType());}System.out.println("=========================================");System.out.println("获取类中所有成员变量:");Field[] fields1 = c1.getDeclaredFields();for (Field f1 : fields1) {System.out.print(f1.getName()+"     ");System.out.println(f1.getType());}System.out.println("=========================================");System.out.println("给指定的变量赋值:");System.out.println("public变量:");Field f2 = c1.getDeclaredField("name");f2.set(stu1,"Bob");//赋值System.out.println(stu1.getName());//获取System.out.println("private变量:");Field f4 = c1.getDeclaredField("sex");给private修饰的变量赋值,需要设置暴力反射f4.setAccessible(true);f4.set(stu1,"male");//赋值System.out.println(stu1.getSex());//获取}public static void test03() throws Exception{//方式二 创建class对象Class c1=Student.class;System.out.println("=========================================");System.out.println("获取类中的构造方法:");Constructor[] cons = c1.getConstructors();for (Constructor con : cons) {System.out.println(con);}System.out.println("=========================================");System.out.println("获取无参的构造方法,创对象:");//获取无参的构造方法 创对象---->调用构造方法 调用构造方法----->创对象Constructor con1 = c1.getConstructor();//通过无参构造方法创建Student对象Student Stu1=(Student)con1.newInstance();System.out.println(Stu1);System.out.println("=========================================");System.out.println("获取有参的构造方法,创对象:");//获取有参的构造方法Constructor con2 = c1.getConstructor(String.class, Integer.class);// 通过有参构造创建对象Student stu2=(Student)con2.newInstance("大黄",5);System.out.println(stu2);System.out.println("=========================================");System.out.println("获取有参的构造方法,创对象:");Constructor con3 = c1.getConstructor(String.class, Integer.class,String.class,String.class);Student stu3=(Student)con3.newInstance("Alice",18,"female","ball");System.out.println(stu3.toString());}public static void test04()throws Exception{System.out.println("===============================");System.out.println("通过反射调用类中的成员方法:");Class c= Class.forName("com.HQSecond.day9.Student");Student Stu1=(Student)c.newInstance();Stu1.name="Jack";//通过反射调用类中的成员方法   参数1:方法的名称, 参数2:方法形参类型Method m = c.getMethod("getName");//执行方法,传递参数System.out.println(m.invoke(Stu1));//测试2 用set方法设置,get方法获取Method m1 = c.getMethod("setHobby", String.class);m1.invoke(Stu1,"ball");Method m2 = c.getMethod("getHobby");System.out.println(m2.invoke(Stu1));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2839.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win 安装 C++运行环境 - MinGW

目录 一、下载二、安装四、检查是否安装成功五、参考文章 一、下载 官网地址:https://www.mingw-w64.org/downloads/ 1.1点击【MingW-W64-builds】 1.2点击【Github】 1.3下载 如果下载太慢,可以使用GitHub Proxy 代理加速 (ghproxy.com) 二、安装 …

华为新版模拟器-ENSP_PRO发布啦

但是下载的话要去申请权限 安装的话 可以在Vbox里面先把这个包添加进去 然后点击控制-新建 这里要选中刚刚添加的虚拟硬盘, 然后点击创建 到这里虚拟机就创建好了 然后点击设置网卡 然后右键点击启动这个虚拟机就行了 此时再打开这个网址 然后点击创建沙箱-数通模拟…

centos7 配置jenkins run docker

本机环境已有jdk11 一、安装配置maven环境 1、下载maven wget https://dlcdn.apache.org/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.tar.gz 2、解压 tar -zxvf apache-maven-3.9.3-bin.tar.gz 3、移动位置 mv apache-maven-3.9.3 /usr/local/ 4、加入环境变…

vue属性中的数据绑定v-text与响应式操作v-html+vue中鼠标悬停显示效果+布尔值在vue中引用属性中的操作

1&#xff0c;vue属性中的数据绑定v-text与响应式操作v-html 当我们导入vue框架后&#xff0c;对于数据的绑定功能&#xff0c;我们使用v-text的语法功能&#xff1a; <div v-text "message"><div>在该情况下&#xff0c;我们可以输出对应属性的文本&a…

重新理解 RocketMQ Commit Log 存储协议

最近突然感觉&#xff1a;很多软件、硬件在设计上是有 root reason 的&#xff0c;不是 by desgin 如此&#xff0c;而是解决了那时、那个场景的那个需求。一旦了解后&#xff0c;就会感觉在和设计者对话&#xff0c;了解他们的思路&#xff0c;学习他们的方法&#xff0c;思维…

maven-mvnd(新版maven)

引言&#xff1a; Maven和Gradle几乎包含了所有Java项目的构建。 而目前绝大部分的Java项目都是使用Maven的方式&#xff0c;Maven对比Gradle的劣势很明显&#xff0c;就是太慢了&#xff01; 一、maven-mvnd是什么&#xff1f; maven-mvnd是Apache Maven团队开发的maven的…

分布式软件架构——分布式事务TCC和SAGA

TCC事务 TCC 是另一种常见的分布式事务机制&#xff0c;它是“Try-Confirm-Cancel”三个单词的缩写&#xff0c;是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。 前面介绍的可靠消息队列虽然能保…

MongoDB简介

目录 1、NoSQL概述 2、什么是MongoDB 3、MongoDB特点 一、MongoDB安装&#xff08;docker方式&#xff09; 二、MongoDB安装&#xff08;普通方式&#xff09; 三、MongoDB 概念解析 1、NoSQL概述 NoSQL(NoSQL Not Only SQL)&#xff0c;意即反SQL运动&#xff0c;指的是…

走进人工智能|强化学习 AI发展的未来引擎

前言&#xff1a; 强化学习是一种通过智能体与环境交互&#xff0c;通过尝试最大化累计奖励来学习最优行为策略的机器学习方法。 文章目录 序言背景AI发展的未来引擎技术支持应用领域总结 本篇带你走进强化学习&#xff01;一起来学习了解吧&#xff01;&#xff01;&#xff0…

npm发布自己的公网包步骤详解

初始化项目 比如我&#xff0c;创建了code-transfor-text_vue项目 根目录初始化git git init .建立开源协议 给项目根目录手动创建LICENSE文件文件&#xff0c;没有后缀名 MIT LicenseCopyright (c) 2023 quanyiPermission is hereby granted, free of charge, to any pers…

Ubuntu 20.04 下g++用不了,但是提示已经安装

问题描述 用sudo apt-get install g来安装&#xff0c;系统却又说g已经是最新版本了&#xff0c;但是用g -v查看又提示需要安装 g&#xff0c;如图片所示。 解决方法 未安装g&#xff0c;安装依赖只需运行命令行&#xff1a; sudo apt-get install build-essential仍然无法成…

Spring MVC获取参数和自定义参数类型转换器及编码过滤器

目录 一、使用Servlet原生对象获取参数 1.1 控制器方法 1.2 测试结果 二、自定义参数类型转换器 2.1 编写类型转换器类 2.2 注册类型转换器对象 2.3 测试结果 三、编码过滤器 3.1 JSP表单 3.2 控制器方法 3.3 配置过滤器 3.4 测试结果 往期专栏&文章相关导读…