Java开发知识之JAVA的反射
Java中的反射机制
一丶什么是反射机制
- 反射就是指Java在运行期间,可以获得类的一些信息.比如构造方法(私有共有...)以及属性
二丶Class类,自描述类.获取类名的三种方法
1.使用静态属性Class获取
代码:
Class cls = Person.class; //获取自描述类
String strClassName = cls.getName();获取类的包名 + 类名
输出(strClassName);
首先我们的Class类是自描述类.可以返回这个类的描述信息.
有很多方法.比如获取类名字,方法.构造等等.
2.使用Class方法 forName()获取自描述Class
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = Class.forName("com.ibinary_01.Person");//传入完整类名获取Class
String clsName = cls.getName();
System.out.println(clsName);
}
可以看到,我们使用forName必须传入完整的类名.
3.使用Object自带的getClass返回自描述Class
- 因为我们的类,继承了Object,所以需要实例,进行调用getClass方法.
代码如下
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = new Person().getClass();
String clsName = cls.getName();
System.out.println(clsName);
}
三个的输出结果都一样,演示一下

三丶了解一下自描述类Class方法.
1.Class针对包,类,父类.接口的方法

通过以上图片可以看到. 我们可以获得包的路径. 我们上面使用的getName(); 那么我们还可以使用getSuperclss();
获得父类自描述类(Class),然后继续调用getName();获取父类的名称.
代码例子如下:
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class cls = new Person().getClass();
Class supercls = cls.getSuperclass();
System.out.println(supercls.getName());
}
当然,我使用的是getClass();首先获得自己的Class,然后在获取父类的Class,最后调用父类的Class的getName();获得类名.
我们也可以使用上面所说的三种方法.
2.Class对构造方法提供的方法

可以看到,以上是我们Class为构造方法提供的方法获取.
3.Class对方法提供的方法.
上面标题有点绕,反正就是对我们的类的方法.提供方法去操作.或者获取.

4.Class对成员变量提供的方法
一样的,对我们的成员变量也提供了方法操作.

5.对内部类提供的方法

总结
- 针对我们的类,方法.构造.以及成员方法都提供了方法支持.首先要熟悉类的操作.
- 在通过getFilds()和getMethods()方法一次获得权限为public的成员变量和方法的时候.将包含从父类中继承到的成员变量和方法.也就是说会获得父类的公共方法和成员变量
- getDeclaredFields()和GETdeclaredMethods();只是获得奔雷中定义的所有成员变量和方法.
四丶反射访问构造方法
- 方面我们讲了,Class中提供了对构造方法的支持.返回Constructior这个类.
- 这个类也提供了对构造方法的操作.
1.构造方法类提供的方法.
构造方法

请注意 newInstance.我们可以利用指定参数.创建一个该类对象.在以后的安卓逆向中.可能会需要.
2.Modifier类
这个类则是传入类型则是调用Construct类中的getModifiers();返回构造方法的类型.传入.然后可以判断是什么属性.
提供的方法


- 四种获得构造方法方式代码
四种获得构造方法,其实是Class类提供的方法.在我们一开始已经截图给出了.
具体就是代码例子使用了.

1.获取所有公共权限的构造方法
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
getAllConstruct(Person.class);
}
static void getAllConstruct(Class<?> cls) {
//第一种,获得所有的构造方法
Constructor c[] = cls.getConstructors();
//遍历输出
for(Constructor i:c) {
System.out.println(i);
}
}
可以看到,上边调用的就是getConstructors():获得了所有公共权限的方法,进行遍历输出了.
输出结果:

2.获取公共权限指定的构造方法
private static void getPublicConstruct(Class<Person> cls) {
// TODO 自动生成的方法存根
try {
Constructor<Person> c = cls.getConstructor(String.class,int.class);//获取指定公共权限的Construct
c.newInstance("1",2); //创建构造方法,并且调用
} catch (Exception e) {
e.printStackTrace();
}
}
获取公共的权限的指定构造方法,我们就需要传入类型的Class. 比如参数为 int.Class 代表一个参数.
下方调用newInstance();就是在使用这个构造.
3.获取所权限的构造方法,放到数组中
private static void getAllConstruct(Class<Person> cls) {
// TODO 自动生成的方法存根
Constructor a[] = cls.getDeclaredConstructors();
for(Constructor i:a) {
System.out.println(i);
}
}
输出结果:

4.获取指定的构造方法
获得指定的就跟上面一样.比如这次我们获得priate权限的方法.并且调用它.
private static void getPrivateConstructAnNewInstance(Class<Person> cls) throws InstantiationException, IllegalAccessException {
// TODO 自动生成的方法存根
try {
Constructor<Person> a = cls.getDeclaredConstructor(int.class,int.class,int.class);//获得指定的
a.setAccessible(true);
a.newInstance(1,1,1);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
首先我们要使用 getDeclaredConstructor(int.Class...);获取指定的构造方法
因为是私有的,所以我们要使用构造方法类提供的 setAccessible(true);设置为共有的.
此时我们在使用newInstance(对应参数类型的参数); 即可实现调用.
结果图:

5.获取构造方法所有参数类型
其实这个方法上面也提供了.叫做 getParameterTypes();这个方法返回一个Class数组.
我们遍历这个数组即可.
private static void getPrivateConstructAnNewInstance(Class<Person> cls) throws InstantiationException, IllegalAccessException {
// TODO 自动生成的方法存根
try {
Constructor<?>[] a = cls.getConstructors();
for(Constructor i:a) {
System.out.println("构造函数 = " + i);//输出构造函数
Class Par[] = i.getParameterTypes();
for(Class j:Par) {
System.out.print(" " + j);//输出参数类型
}
System.out.println();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
输出结果:

五丶成员变量的获取以及使用
1.获取所有公共权限成员变量
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field[] f = cls.getFields();//获取所有成员变量
for(Field i:f) {
System.out.println(i);
}
}
使用方法getFields()即可.输出之后会显示所有的名字.

2.获取公共权限指定的成员变量
使用方法: getField(String name);
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field f;
try {
f = cls.getField("pid");
System.out.println(f);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
结果同上,我们需要传入名字才可以.
3.获取所有权限的成员变量
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
Field a[] = cls.getDeclaredFields();
for(Field i:a) {
System.out.println(i);
}
}
输出结果:

4.获得指定权限的成员变量
private static void getPublicAllFields(Class<Person> cls) {
// TODO 自动生成的方法存根
try {
Field a = cls.getDeclaredField("name");
System.out.println(a);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
5.设置跟使用成员变量
我们上面可以获取.但是我们要使用.或者要更改值.
二个步骤.
1.获取Cls new出来的实例对象.
2.使用Set方法设置值.
如果设置私有,则要设置权限才可以.
private static void getPublicAllFields(Class<Person> cls) throws Exception {
// TODO 自动生成的方法存根
Object obj = cls.newInstance();
try {
Field a = cls.getDeclaredField("name");
a.setAccessible(true); //使用私有就要设置权限.
a.set(obj, "张三");
System.out.println(a.get(obj));//并且获取设置的成员变量值.
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
结果:

Java开发知识之JAVA的反射的更多相关文章
- Java开发知识之Java中的Map结构
Java开发知识之Java中的Map结构 一丶Map接口 Map没有实现Collection接口,提供的是Key 到Value的映射. Map中.不能包含相同的Key,每个Key只能映射一个Value ...
- Java开发知识之Java中的集合Set接口以及子类应用
---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...
- Java开发知识之Java中的集合上List接口以及子类讲解.
Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...
- Java开发知识之Java中的泛型
Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...
- Java开发知识之Java的枚举
Java开发知识之Java的枚举 一丶什么是枚举 枚举可以理解为就是常量,在Java中我们定义常量.都是用 final语句. C++中都是用const关键字. 枚举跟C++概念都是一样的.就是特定的常 ...
- Java开发知识之Java的异常处理
Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...
- Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字
Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字 一丶Java中包的机制 首先包其实就是个文件夹.作用就是管理类. Java中每次定义一个类的时候.通过Java编译之后.都会生 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- Java开发知识之Java的数字处理类Math类
Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...
- Java开发知识之Java的包装类
Java开发知识之Java的包装类 一丶什么是包装类 包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同. 具体可以查询JAVA A ...
随机推荐
- 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...
- 记一次JVM故障排除
今天,自己开发的事件驱动的java大规模爬虫程序上线了几个新任务后突然异常. 异常: 程序业务异常,经查看CPU利用率满,内存满,一直报OOM,目测有内存泄露.如下图所示,四核16G的内粗,CPU高达 ...
- python-简单邮件报警
在scrapy爬虫项目中经常遇到 爬取数据时报错无法及时处理 导致数据爬取不完整 只能先查看log才能发现报错 首先写一个简单的邮件发送模块 """ @file: ema ...
- Python基础之迭代器、生成器
一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...
- 串口RS232和485通信的波形分析
一.串行数据的格式 异步串行数据的一般格式是:起始位+数据位+停止位,其中起始位1 位,数据位可以是5.6.7.8位,停止位可以是1.1.5.2位. 起始位是一个值为0的位,所以对于正逻辑的TTL电平 ...
- 使用abcpdf分页设置的问题
如果需要在分页时不对模块进行截断,请为相应模块添加打印样式“page-break-inside: avoid” 如果需要在指定位置进行强制分页,请添加:“<div style="pag ...
- 对scanf和printf的研究!!
在做项目的时候,突然很纠结要不要清理.所以赶紧写一篇博客记一下!! 1. scanf函数 在代码中,如果碰到了两个挨着输入的情况,就会出现问题!! 输入一个字符 r 就会出现一下情况!! 第2句sca ...
- Luogu P1894 [USACO4.2]The Perfect Stall
传送门 是道绿题???二分图(网络流)不应该是蓝打底??? 这题浏览一遍就知道是二分图(网络流)算法喽,二分图代码太短,不想写(←这人???),所以就拿网络流练练手. 设源点S=0,汇点T=n+m+1 ...
- 第二次Srum冲刺
一.项目简介 1.项目名称:云医院智能管理系统 2.项目介绍:该项目涵盖了目前医院里的一些基本需求,由于时间和技术有限,先暂时列出如下图所示的一些要实现的功能,关于实现的过程,还需在后面的学习当中不断 ...
- Java中的读写锁
一.读写锁 1.初识读写锁 a)Java中的锁——Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...