反射
首先是类的加载,连接,初始化
四种获取类的Class对象的方法
1、类型名.class说明:
基本数据类型和void,只能通过这种方式。
2、对象.getClass():获取对象的运行时类型说明:只能用于引用数据类型
3、Class.forName(“类的全名称")类的全名称:包.类名
4、类加载器对象.loadClass(“类的全名称")
然后是四种类加载器
1、引导类加载器(Bootstrap Classloader):又称为根类加载器它负责加载]ava的核心库
它用原生代码(C/C++)来实现的,并不继承自java.lang.ClassLoder
2、扩展类加载器(Extension ClassLoader) JAVA_HOME/ire/ext/*.jar
3、应用程序类加载器(Application Classloader) classpath下,就是自定义类型
4、自定义类加载器例如:tomcat
Java的类加载的过程是一个双亲(parent)委托模式加载的:
当“应用程序类加载器”接到一个加载任务时:
(1)先搜索内存中是否已经加载过了,如果加载过了,就可以找到对应的Class对象,那么就不加载了。
(2)如果没有找到,把这个任务先提交给“parent”,父加载器接到任务时,也是重复(1)(2)
(3)直到传给了根加载器,如果根加载器可以加载,就完成了,如果不能加载,往回传,依次每个加载器尝试在自己负责的路径下搜索,如果找到就直接返回C1ass对象,如果一直回传到“应用程序类加载器”,还是没有找到,就会报ClassNotFoundException。
类加载器的作用:
1、最主要的作用:加载类
2、辅助的作用:可以用它来加载“类路径下”的资源文件
JavaSE:例如:bin中SrC下文件-->bin目录下
ClassLoader:
(1)静态方法
ClassLoader.getSystemResourceAsStream("src1.properties")
但是这个适用于JavaSE阶段,因为它用应用程序类加载器去加载的如果是Web阶段,用这个方法是有问题的,因为web阶段的类路径在WEB-INF/classes下,必须由它自定义类加载器
(2)非静态方法
类加载器对象.getResourceAsStream("src1.properties") Web阶段用这个
Properties:Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是字符串
通过反射查看类的信息
在运行期间,动态的获取某个类的详细信息步骤:
1、获取某个类型的Class对象
2、使用Class和java.lang.reflect包下面的其他类型的API
使用反射生成并操作对象
在运行期间,动态的创建任意类型的对象,
1、Class对象.newInstance()
前提:这个类型必须有无参构造
步骤:
(1)获取Class对象
(2)直接调用Class对象.newInstance()
2、构造器来创建对象
步骤:
(1)获取Class对象
(2)获取构造器对象,获取其中一个
C1ass类中有这样的方法:
ConstructorgetDeclaredConstructor(Class<?>..…parameterTypes)
parameterTypes:构造器形参的类型列表
(3)用构造器创建对到 java.lang.reflect.Constructor类型中:
T newInstance(Object...initargs)
initargs:创建对象时,给构造器的实参列表
运行期间,动态的为对象的属性赋值或获取属性值步骤:
1、获取Class对象
2、获取Field属性对象
3、创建实例对象,Class代表的类型的实例对象
4、调用Fie1d对象.set(实例对象,属性值)调用Field对象.get(实例对象)
说明:如果属性是私有的,那么可以调用Field对象.setAccessible(true);
在运行期间,动态的调用任意对象的任意方法步骤:
1、获取Class对象
2、获取Method对象
方法有重载,就用方法名+形参列表clazz.getDeclaredMethod(name,parameterTypes)
3、创建实例对象
4、调用方法
```java
public static Object createobject() {
<pre><code> try {
// 创建properties集合
Properties pro = new Properties();
// 从文件中加载内容到集合中
pro.load(BeanDemo.class.getResourceAsStream("/stu.properties"));
// 从集合中获得类名
String className = pro.getProperty("class");
// 通过反射获得Class对象
Class c = Class.forName(className);
// 快速创建对象
Object obj = c.newInstance();
// 遍历集合
Set<String> names = pro.stringPropertyNames();
for (String name : names) {
// 判断name是否class
if (name.equals("class"))
continue;
// 获得值
String value = pro.getProperty(name);
// name:成员变量名
// 根据成员变量名获得对应的Field对象
Field f = c.getDeclaredField(name);
// 强制反射
f.setAccessible(true);
// 获得成员变量的类型
Class typeclass = f.getType();
if (typeclass == int.class) {// 判断成员变量的数据类型是否是int类型
f.setInt(obj, Integer.parseInt(value));
} else {
// 给对象的赋值
f.set(obj, value);
}
}
// 返回对象
return obj;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
</code></pre>
```
- 十步完全理解 SQL
- 利用HSTS嗅探浏览器历史纪录的三个漏洞
- Verilog代码设计风格
- Yaffs_checkptrw
- 那些 Shell、Awk 中自动隐式类型转换的“坑”
- 浏览器 HTTP 协议缓存机制详解
- 详解 Windows 下 Eclipse CDT 配置 C/C++ 编译环境
- 硬核乘法器的Verilog HDL 调用
- Web 自动化测试与智能爬虫利器:PhantomJS 简介与实战
- 浅谈 Scala 中下划线的用途
- Java 多线程之 Runnable VS Thread 及其资源共享问题
- 块RAM的Verilog HDL调用
- 玩转千位分隔符输出
- DCM 模块的Verilog HDL 调用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- tp5框架使用composer实现日志记录功能示例
- python 图像插值 最近邻、双线性、双三次实例
- tp5(thinkPHP5)框架实现多数据库查询的方法
- Python-openCV开运算实例
- php curl获取https页面内容,不直接输出返回结果的设置方法
- 详解php中curl返回false的解决办法
- Pytorch mask-rcnn 实现细节分享
- pytorch中的weight-initilzation用法
- python安装读取grib库总结(推荐)
- PHP5.5新特性之yield理解与用法实例分析
- php如何利用pecl安装mongodb扩展详解
- PHP微信支付结果通知与回调策略分析
- PHP标准库(PHP SPL)详解
- php成功操作redis cluster集群的实例教程
- 在pytorch中动态调整优化器的学习率方式