反射Typora总结

news/2024/5/19 2:26:50 标签: java, 反射

目录

      • 概念
      • 应用场景
      • 反射常用API
      • 获取字节码对象的三种方式
      • 通过字节码对象获取其他对象
      • 获取类中方法的几种方式
      • 反射普通方法调用
      • 反射私有方法调用
      • 反射私有构造方法调用
      • Field用法
      • 总结

概念

反射java提供的一种机制,可以在类的运行时期动态的获取类中所有的信息(任意字段、构造方法,普通成员方法。。。。)

应用场景

缺点:会破坏封装性,损失性能。 尽量少用反射

安卓应用场景:安卓中一些私有的类通常是系统相关的比如调用系统硬件设备等类,设备管理器。开发需要,就只能通过反射去调用这些私有的方法

Java应用场景:解耦的。在开发中,做一个项目是很多人一起开发,a(用户登录注册相关) b(列表,加入购物车) c(订单结算) 三个程序员共同开发

反射常用API

1.java.lang.Class
2.java.lang.reflect.Constructor
3.java.lang.reflect.Method
4.java.lang.reflect.Field

获取字节码对象的三种方式

java">        //获取字节码对象的第一种方式:    类名.class*/
		Class clazz = User.class;
		//获取字节码对象的第二种方式:    Class.forName();   解耦合了  jdbc
	    Class clazz1 = Class.forName("cn.itsource.reflect.User");
		//获取字节码对象的第三种方式      对象.getClass()		 
		Class clazz2 = new User().getClass();

通过字节码对象获取其他对象

java">		//用字节码对象调用相关方法获取Field,Constructor,Method所有对象。(加s代表所有)
        Class clazz = User.class;
		Method[] ms = clazz.getMethods();
		Field[] fs = clazz.getFields();
		Constructor[] cs = clazz.getConstructors();

获取类中方法的几种方式

java">		Class clazz = User.class;
		Method[] ms = clazz.getMethods();    		//获取本类公有的方法和父类继承过来的方法
        Method[] ms2 = c2.getDeclaredMethods();   	//获取本类公有和私有的所有方法	
		//获取指定的方法   (不加s代表指定)(没有参数类型就不写)
        Method m = clazz.getMethod("method",int.class);  		//获取本类和父类指定公有方法
		Method m2 = clazz.getDeclaredMethod("method",int.class);//获取本类指定可以是私有方法

反射普通方法调用

java">		Class<User> clazz = User.class;
		//获取指定的方法,("方法名",参数类型.class)
		Method m = clazz.getMethod("method",int.class);
		User user = new User();
		//返回值表示调用方法本身的返回内容
		// obj :表示方法所属的对象 ,args:表示方法的实际参数。
		Object r = m.invoke(user, 10);
		System.out.println(r);

反射私有方法调用

private编译时期有效,反射是在运行时期

java">		Class clazz = User.class;
		Method m = clazz.getDeclaredMethod("methodPrivate");		//2.获取指定的方法
		m.setAccessible(true);										//暴力反射。破坏了封装,设置可以访问。
		//通过反射获取类的对象。但是private构造创建对象无效。需要先用反射去暴力获取私有构造方法再造对象
		Object newInstance = clazz.newInstance();	//底层反射。或者还用User user = new User();
		m.invoke(newInstance);

反射私有构造方法调用

java">		//获取Runtime构造器对象
		Constructor<Runtime> c = Runtime.class.getDeclaredConstructor();
		//设置可以访问
		c.setAccessible(true);
		//invoke --> newInstance 通过反射创建Runtime类对象
		Runtime newInstance = c.newInstance();
		System.out.println(newInstance);

		//通过单例模式创建对象
		Runtime runtime = Runtime.getRuntime();
		System.out.println(newInstance);

Field用法

java">		Field f = User.class.getDeclaredField("name");
		//设置可以访问
		f.setAccessible(true);
		User user = new User();
		f.set(user, "jack");
		System.out.println(f.get(user));
		System.out.println(user.getName());

总结

1.找到字节码对象
2.通过字节码对象找到具体对象(Method,Constructor,File)。
3.找具体要反射的方法
4.要反射的方法是私有的需要设置可以访问,setAccessible
5.调用,invoke,newInstance,set


http://www.niftyadmin.cn/n/262689.html

相关文章

如何保证Redis和数据库的一致性

关注我&#xff0c;升职加薪就是你&#xff01; 当我们对数据进行修改的时候&#xff0c;到底是先删缓存&#xff0c;还是先写数据库&#xff1f; 1、如果先删缓存&#xff0c;再写数据库&#xff1a;在高并发场景下&#xff0c;当第一个线程删除了缓存&#xff0c;还没来得及写…

NumPy常用方法总结

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以…

单链表——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容终于是我们心心念念的单链表啦&#xff0c;这一块呢&#xff0c;是一个很重要的部分&#xff0c;也是一个对目前的我来说&#xff0c;比较困难的部分&#xff0c;下面&#xff0c;就让我们进入单链表的世界吧 之…

强烈推荐这 6 款 API 测试工具,绝对有一款没听过

Postman: Postman 是一个流行的 API 开发和测试工具&#xff0c;提供了丰富的功能&#xff0c;包括请求构建、测试自动化、数据驱动等。用户可以通过 Postman 的界面轻松创建和测试 RESTful API。 Insomnia: Insomnia 是一款功能强大的开源 API 测试工具&#xff0c;支持多种协…

一日一题:第十二题---模拟散列表(三种方法!!)

​作者&#xff1a;小妮无语 专栏&#xff1a;一日一题 &#x1f6b6;‍♀️✌️道阻且长&#xff0c;不要放弃✌️&#x1f3c3;‍♀️ 今天来给大家介绍的是简单的Hash表的应用 目录 关于哈希的知识点 题目描述&#xff08;模拟散列表&#xff09; 代码 1&#xff08;拉链…

vi编辑器命令

1.vi的操作模式 vi提供两种操作模式&#xff1a;输入模式&#xff08;insert mode&#xff09;和指令模式&#xff08;command mode&#xff09;。在输入模式下&#xff0c;用户可输入文本资料。在指令模式下&#xff0c;可进行删除、修改等各种编辑动作。 在输入模式下&#…

一文读懂Springboot如何使用ChatGPT

ChatGPT使用步骤 OpenAI官网注册账号创建OpenAI AppKey申请VPN代理引入Maven依赖 SpringBoot使用 依赖 <dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>service</artifactId><version>${gpt.server.vers…

第四章——数学知识1

质数 质数&#xff1a;在大于1的整数中&#xff0c;如果只包含1和本身这俩个约束&#xff0c;就被叫质数或素数。 质数判定试除法 质数的判定——试除法&#xff1a;如果d能整除n&#xff0c;则n/d再除n&#xff0c;结果是一个整数。 d≤n/d。 bool is_prime(int x) {if (x <…