JAVA入门——反射

news/2025/3/6 20:30:46/

一、什么是反射

  • 反射允许对封装类的字段、方法和构造函数的信息进行编程访问
  • 我们是从class字节码文件中获取这些信息的,所以先学习如何获取class文件

二、获取class对象的三种方式

Class.forName("全类名")

类名.class

对象.getClass()

 例:

  • 第一种最常用,第二种多当做参数用,第三种只有在有了类对象时会用
java">public class MyReflectTest1 {public static void main(String[] args) throws ClassNotFoundException {//1.第一种方式://全类名:包名+类名Class class1 = Class.forName("com.ma6.reflect.Student");//2.第二种方式:Class class2 = Student.class;//3.第三种方式:Class class3 = new Student().getClass();System.out.println(class1 == class2);System.out.println(class2 == class3);}}

三、利用反射获取构造方法(Class类中方法)

Constructor是一个描述构造方法的类,JAVA中的所有事物都能看做对象,都有对应的类

Constructor<?>[] getConstructors();                //返回所有公共构造方法对象的数组

Constructor<?>[] getDeclaredConstructors();  //返回所有构造方法对象的数组

Constructor<T> getConstructor(Class<?>...parameterTypes);  //返回单个公共构造方法对象

Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes); //返回单个构造方法对象

注意:

  • 使用带有Declared的方法确实能获取私有的构造方法,但这仅仅是能看到,不能使用
  • 如果想要使用,需要先调用setAccessiable方法,传递true,再调用构造方法,这种方法称做“暴力反射”

小例子:

java">import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class MyReflectTest2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//1.获取字节码文件对象Class<?> clazz = Class.forName("com.ma6.reflect.Student");//2.获取构造方法//<?>是无界通配符,可以匹配任意类型
/*        Constructor<?>[] cons = clazz.getConstructors();for (Constructor<?> con : cons) {System.out.println(con);}System.out.println();*//*        Constructor<?>[] cons1 = clazz.getDeclaredConstructors();for (Constructor<?> con : cons1) {System.out.println(con);}System.out.println();*//*        //获取空参构造Constructor<?> con2 = clazz.getDeclaredConstructor();System.out.println(con2);//获取String的构造Constructor<?> con3 = clazz.getDeclaredConstructor(String.class);System.out.println(con3);//获取int的构造Constructor<?> con4 = clazz.getConstructor(int.class);System.out.println(con4);*///获取String,int的构造Constructor<?> con5 = clazz.getConstructor(int.class, String.class);System.out.println(con5);//3.获取构造方法属性//获取权限修饰符,构造方法的所有属性都能查询,详细查询帮助文档int modifiers = con5.getModifiers();System.out.println(modifiers);//4.可以用来创建对象Student stu = (Student)con5.newInstance(11, "王牛牛牛");System.out.println(stu);}}

四、利用反射获取成员变量

Field:描述成员变量类

Field[] getFields();               //返回所有公共成员变量对象的数组

Field[] getDeclaredFields();//返回所有成员变量对象的数组

Field getField(String name);//返回单个公共成员变量对象

Field getDeclaredField(String name);//返回单个成员变量对象

Field类中用于创建对象的方法:

void set(Object obj,Object value);//赋值

Object get(Object obj);                  //获取值

java">import java.lang.reflect.Field;public class MyReflectTest3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class<?> clazz = Class.forName("com.ma6.reflect.Student");//1.Field[] field = clazz.getDeclaredFields();for (Field field1 : field) {System.out.println(field1);}//2.Field name = clazz.getDeclaredField("name");System.out.println(name);//3.String n = name.getName();int mod = name.getModifiers();Class<?> type = name.getType();//4.获取成员变量记录的值Student s = new Student(13,"王牛牛牛");name.setAccessible(true);//私有变量,要暴力反射String value = (String)name.get(s);System.out.println(value);//5.修改对象里的值name.set(s,"王犇");System.out.println(s);}}

五、反射获取成员方法

Method:描述成员方法的类

Method[] getMethods();        //返回所有公共成员方法,包括继承

Method[] getDeclaredMethods();//返回所有成员方法对象,不包括继承

Method getMethods(String name,Class<?>...parameterTypes);

Method getDeclaredMethods(String name,Class<?>...parameterTypes);

Method类中创建对象方法:(方法运行)

Object invoke(Object obj,Object...args)

用obj调用方法,args是传的参数

java">public class MyReflectTest4 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.Class<?> clazz = Class.forName("com.ma6.reflect.Student");//2.Method eat = clazz.getDeclaredMethod("eat", String.class);System.out.println(eat);//3.Student s = new Student();eat.setAccessible(true);eat.invoke(s,"史");}
}


http://www.ppmy.cn/news/1577166.html

相关文章

探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调

文章目录 2.7 QAM 调制 / 解调2.7.1 概述2.7.2 星座图星座图的结构与性能发射端的信息编码与接收端的解码差分编码的分类与实现差分编码的模4格雷加法器公式16QAM星座图与映射关系 2.7.3 信号表达式正交振幅调制的基本原理与系统分析相位误差对QAM性能的影响多电平正交振幅调制…

C# Unity 唐老狮 No.6 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

协议-Airkiss

是什么&#xff1f; 设备 A 与外界没有建立任何实质性连接&#xff0c;可以称之为信息孤岛。设备 B 通过路由 或者直接 将 Wifi 的 ssid 与密码 UDP广播 传递给 A 为什么&#xff1f; 解决将无线网络的 ssid 与密码传输到设备难题 怎么做&#xff1f; 芯片自带AT指令开启Air…

Matlab 大量接单

分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB&#xff1a;熟练掌握MATLAB编程语言&#xff0c;能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…

【leetcode hot 100 54】螺旋矩阵

错误解法&#xff1a;以轮数定义旋转过程进行输出 class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list new LinkedList<>();int round0; // 已经循环的轮数int i0,j0;int mmatrix.length, nmatrix[0].length;while(ro…

yum修改阿里云

第一步&#xff1a;打开FinalShell&#xff0c;点击haodoop100&#xff0c;输入命令&#xff1a; sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 第二步&#xff1a;继续输入命令&#xff1a;sudo yum clean all …

前端基础之浏览器本地存储

如我们在一些网站中&#xff0c;去进行数据搜索&#xff0c;在浏览器中是有一个对于的存储的&#xff0c;并且我们可以去手动进行value的增删操作 LocalStroage的使用 并且将浏览器关闭之后&#xff0c;数据也会保存&#xff0c;除非用户手动清理数据或是清空缓存 <!DOCTYPE…

2022 年学习 Spring Boot 开发的最佳书籍

在我们之前的文章中&#xff0c;我们查看了学习 Java 编程的必读书籍我们在其中探索了一些您可以利用的资源来加快 Java 开发的速度。在此基础上&#xff0c;在用 vanilla Java 编写一段时间后&#xff0c;您将意识到组织文件和其他内容&#xff08;例如设置 getter 和 setter、…