黑马程序员——Java基础---反射
来源:互联网 发布:华中地区数据科学会议 编辑:程序博客网 时间:2024/04/28 05:39
反射
JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。
动态获取类中信息,就是java反射。可以理解为对类的解剖。
如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术。
P.S.
所谓的框架就是对外提供一些接口,也就是功能扩展的标准,由实现类按照这个接口标准去实现。框架内部如果需要操纵这些实现类的对象完成某些操作,那么只需要把这些实现类的全名(包名+类名)写在某个配置文件中,框架代码只需要读取这个配置文件,就可以获取这个实现类的字节码文件,然后利用反射技术创建这个实现类的对象并且调用相应的方法完成一些操作。
用于描述字节码的类就是Class类,创建对象,可以提取字节码文件中的内容,如字段、构造函数、一般函数。该类就可以获取字节码文件中的所有内容,那么反射就是依靠该类完成的。想要对一个类文件进行解剖,只要获取到该类的字节码文件对象即可。
实际开发中一些常用,但又容易写错,遗忘的
// 使用反射技术得到T的真实类型
// 获取当前new的对象的 泛型的父类 类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
// 获取第一个类型参数的真实类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
// 获取当前new的对象的 泛型的父类 类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
// 获取第一个类型参数的真实类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
使用反射获取Method,可以使用getMethod(String name, Class<?>... parameterTypes)来获取,第一个参数是方法的名字,第二个是参数类表
但是这个方法没参数呢?比如:
一个简单的Person 类
如果是调用set方法很简单,根据规则
这样就获取了,但是如果是get 方法呢,参数列表是空,怎么做的?
这样可以
这样更好
但是这个方法没参数呢?比如:
一个简单的Person 类
如果是调用set方法很简单,根据规则
这样就获取了,但是如果是get 方法呢,参数列表是空,怎么做的?
这样可以
这样更好
示例:获取字节码文件对象的3种方式
Person.java
ReflectDemo.java
运行结果:person run
person run
true
--------------------
true
--------------------
class com.test.Person
示例:获取Class中的构造函数
运行结果:
person run
true
--------------------
true
--------------------
class com.test.Person
示例:获取Class中的构造函数
运行结果:
person run
--------------------
Person param run...小明:38
示例:获取Class的字段
--------------------
Person param run...小明:38
示例:获取Class的字段
运行结果:
person run
private int com.test.Person.age
private int com.test.Person.age
示例:获取Class中的方法
运行结果:public void com.test.Person.show()
public void com.test.Person.paramMethod(java.lang.String,int)
private void com.test.Person.privateMethod()
public static void com.test.Person.staticMethod()
---------------------------
person run
Person param run...小明:37
小明...show run...37
---------------------------
person run
person run
paramMethod run...小强:89
练习:反射练习
代码:
PCI.java
SoundCard.java
NetCard.java
Mainboard.java
pci.Properties
ReflectTest.java
public void com.test.Person.paramMethod(java.lang.String,int)
private void com.test.Person.privateMethod()
public static void com.test.Person.staticMethod()
---------------------------
person run
Person param run...小明:37
小明...show run...37
---------------------------
person run
person run
paramMethod run...小强:89
练习:反射练习
代码:
PCI.java
SoundCard.java
NetCard.java
Mainboard.java
pci.Properties
ReflectTest.java
0 0
- 黑马程序员——java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础--- 反射
- 黑马程序员——JAVA基础 反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——java基础---反射
- 黑马程序员——Java基础---反射
- 黑马程序员——JAVA基础------反射
- 黑马程序员——JAVA基础---反射
- 黑马程序员—JAVA基础—反射
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础--反射
- 黑马程序员——java基础---反射
- 黑马程序员——Java基础---反射
- Linux服务器意外关机,开机提示一下信息:an error occurred during the file system check.
- 《Java课程实习》日志(周二)
- 菜鸟上路
- 莫名其妙问题
- UITextField的leftView不贴边处理
- 黑马程序员——Java基础---反射
- dll项目中_declspec(dllimport)和_declspec(export)使用
- OJ第三批——Problem R:P3 数钱是件愉快的事
- LeetCode Gray Code
- android中控件Checkbox复选框的使用
- c++中map
- LeetCode-208 Implement Trie (Prefix Tree)
- 递归实现全排列,字典序法实现全排列
- 29Divide Two Integers