java反射概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*** 反射机制* @author JIANGJINGWEI* @create 2020-05-11-22:20*/
public class ReflectionTest1 {//反射之前,对Person的操作@Testpublic void test1(){//1.创建Person对象Person p1 = new Person("kite",123);//2.调用其属性和方法p1.age = 10;System.out.println(p1.toString());p1.show();//在Person类外部,不可以通过Person类的对象调用其内部私有结构。//比如:name、showNation()、以及私有构造器}//反射之后,对于Person的操作@Testpublic void test2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {Class  personClass = Person.class;//1.通过反射,创建Person对象Constructor cons = personClass.getConstructor(String.class, int.class);Object obj = cons.newInstance("Tom", 12);//这个Object对象其实还是Person,多态的体现Person p = (Person) obj;System.out.println(obj.toString());//Person{name='Tom', age=12}//2.通过反射,调用对象指定的属性、方法Field age = personClass.getDeclaredField("age");//调用属性age.set(p,10);System.out.println(p.toString());//调用方法Method show = personClass.getDeclaredMethod("show");show.invoke(p);//通过反射,可以调用Person类的私有结构。比如:私有构造器、私有属性和方法。Constructor cons1 = personClass.getDeclaredConstructor(String.class);cons1.setAccessible(true);Person p1 = (Person) cons1.newInstance("jake");System.out.println(p1);//调用私有属性Field name = personClass.getDeclaredField("name");name.setAccessible(true);name.set(p1,"jerry");System.out.println(p1);//调用私有的方法Method showNation = personClass.getDeclaredMethod("showNation", String.class);showNation.setAccessible(true);String nation = (String) showNation.invoke(p1, "中国");//相当于p1.showNation("中国");System.out.println(nation);//中国}//问题1:通过直接new方式或反射的方式都可以调用公共开发的结构,开发中用哪个?//建议:直接new的方式。//什么时候用反射的方式;反射的特征:动态性//问题2:反射机制与面向对象中的封装性是不是矛盾的?如何看待两个技术?//不矛盾。/*关于java.lang.Class类的理解1.类的加载过程:程序在经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程叫做类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。2.换句话说,Class的实例就对应着一个运行时类。3.加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类*///获取Class实例的方式(前三中方式需要掌握,第三种最常使用)@Testpublic void test3() throws ClassNotFoundException {//方式一:调用运行时类的属性: .classClass<Person> clazz1 = Person.class;System.out.println(clazz1);//class java1.Person//方式二:通过运行时类的对象,调用getClassPerson p1 = new Person();Class clazz2 = p1.getClass();System.out.println(clazz2);//class java1.Person//方式三:调用Class的静态方法:forName(String classPath)Class clazz3 = Class.forName("java1.Person");System.out.println(clazz3);//class java1.PersonSystem.out.println(clazz1==clazz2);//trueSystem.out.println(clazz1==clazz3);//true//方式四:使用类的加载器:ClassLoaderClassLoader classLoader = ReflectionTest1.class.getClassLoader();Class clazz4 = classLoader.loadClass("java1.Person");System.out.println(clazz4);System.out.println(clazz1==clazz4);//true}//CLass实例可以是那哪些结构?@Testpublic void test4(){int[] a = new int[10];int[] b = new int[100];//只要数组的元素类型与维度一样,就是同一个ClassSystem.out.println(a.getClass()==b.getClass());//true}//万事万物皆对象?对象.xxx,File,URL,翻身,前端,数据库操作
}
/*** @author JIANGJINGWEI* @create 2020-05-11-22:21*/
public class Person {private String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}private Person(String name) {this.name = name;}public Person() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void show(){System.out.println("nihao!!!");}private String showNation(String nation){System.out.println("nation:"+nation);return nation;}
}

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

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

相关文章

Unity 实现字幕打字效果

Text文本打字效果&#xff0c;TextMeshPro可以对应参考&#xff0c;差距不大&#xff0c;改改参数名就能用。改脚本原本被我集成到其他的程序集中&#xff0c;现在已经分离。 效果 实现功能 1.能够设置每行能够容纳的字数和允许的冗余 2.打字效果 3.每行打完上移 4.开头进入&…

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

文章目录 注入流程&#xff1a;1、判断数据库类型2、判断表名3、判断列名4、判断列数1&#xff09;判断显示位 5、判断数据长度6、爆破数据内容 注入流程&#xff1a; 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…

Java课题笔记~ AspectJ 对 AOP 的实现(掌握)

AspectJ 对 AOP 的实现(掌握) 对于 AOP 这种编程思想&#xff0c;很多框架都进行了实现。Spring 就是其中之一&#xff0c;可以完成面向切面编程。然而&#xff0c;AspectJ 也实现了 AOP 的功能&#xff0c;且其实现方式更为简捷&#xff0c;使用更为方便&#xff0c;而且还支…

Object Map 的相互转换

学生业务对象定义&#xff1a;Student Student student new Student(); student.setId(1L); student.setName("令狐冲") student.setAge(10) 第一种&#xff1a;通过Alibaba Fastjson实现 pom.xml 文件依赖 <dependency><groupId>com.alibaba</g…

PHP 前后端分离,运行配置

H5 WEB目录:安装 yarn install、npm install &#xff08;依赖包&#xff09; 在电脑&#xff1a;安装nodejs Composer下载 &#xff1a;https://getcomposer.org/

UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

引言&#xff1a; 所有的操作系统都为运行在其上的程序提供服务&#xff0c;比如&#xff1a;执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等 1. UNIX体系结构 从严格意义上来说&#xff0c;操作系统可被定义为一种软件&#xff0c;它控制计算机硬件资源&…

【C++】异常exception

文章目录 1. C语言中传统的处理错误方法2. C中的异常3. 异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 4. 自定义异常体系5. 异常的优缺点 &#x1f4dd; 个人主页 &#xff1a;超人不会飞)&#x1f4d1; 本文收录专栏&#xff1a;《C的修行之路》…

解释器模式-自定义语言的实现

有时&#xff0c;我们希望输入一串字符串&#xff0c;然后计算机能够按照预先定义的文法规则来对这个字符串进行解释&#xff0c;从而实现相应的功能。 例如&#xff0c;我们想实现简单的加减法接收器&#xff0c;只需输入一个表达式&#xff0c;它就能计算出表达式结果。比如…

性能测试jmeter连接数据库jdbc(sql server举例)

一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能发起…

Metashape和PhotoScan中文版软件下载安装地址

Metashape的点云生成功能 Metashape具有强大的点云生成功能&#xff0c;可以将图像转换为精确的三维点云数据。点云数据是进行三维建模和地形分析的重要基础。 在使用Metashape时&#xff0c;用户可以通过使用图像对齐功能生成点云数据。软件根据对齐后的图像生成稠密的点云&a…

SpringBoot系列---【三种启动传参方式的区别】

三种启动传参方式的区别 1.三种方式分别是什么? idea中经常看到下面三种启动传参方式 优先级 Program arguments > VM options > Environment variable > 系统默认值 2.参数说明 2.1、VM options VM options其实就是我们在程序中需要的运行时环境变量&#xff0c;它需…

从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现

目录 1. 哈希结构 1.1 哈希的概念 1.2 哈希冲突(碰撞) 1.3 哈希函数 2. 闭散列/开散列解决哈希冲突 2.1 闭散列概念和代码 2.1.1 闭散列线性探测&#xff08;实现&#xff09; 闭散列线性探测完整代码 2.1.2 闭散列二次探测&#xff08;了解&#xff09; 2.2 开散列(…