使用反射动态实例化类,可以在运行时根据参数实例化不同的类,比如使用简单的工厂模式。

Factory类:

public class Factory {

public static Component getComponent(String componentName) {

try {

Class> componentClass = Class.forName("com.tcpan.es.component." + componentName);

Constructor> constructor = componentClass.getDeclaredConstructor(String.class);

return (Component) constructor.newInstance("hi");

} catch (Exception ex) {

return null;

}

}

}

注意:

Class.forName方法传参必须使用类的全名。如果不带包名的话,是不会实例化当前包下的类。

Constructor> constructor = componentClass.getDeclaredConstructor(String.class);

这个是获取实例化类的构造函数,一个类可能有多个构造函数,必须选择之后newInstance调用的那个。

Class类的工作方式:

1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象

2.Class.forName(“类名字符串”) (注:类名字符串是包名+类名) 说明:装入类,并做类的静态初始化,返回Class的对象

3.实例对象.getClass() 说明:对类进行静态初始化、非静态初始化;返回引用运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象

结论:

我们知道,静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。

因此,这段程序说明,三种方式生成Class对象,其实只有一个Class对象。在生成Class对象的时候,首先判断内存中是否已经加载。

所以,生成Class对象的过程其实是如此的:

当我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。

java 动态获取类实例化_Java:使用反射动态实例化类相关推荐

  1. java 反射获取修饰符_java之反射和BeanUtils类

    反射和BeanUtils类 1. 类的初始化:类什么什么情况下会加载到内存中 只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象 2. javaBean:数据库中的表和java中的 ...

  2. java 获取所有实现类_Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这 ...

  3. java 反射获取实体类_Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...

  4. java 给对象创建实例_Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  5. 在java中获取当前时间_JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  6. java如何获取当天日期_Java 中获取当前时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  7. java编程获取屏幕分辨率_Java编程获取当前屏幕分辨率的方法示例

    本文实例讲述了Java编程获取当前屏幕分辨率的方法.分享给大家供大家参考,具体如下: /** * This class implements the functionality of fetching ...

  8. java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...

  9. kotlin 反射java类_关于Kotlin反射中实例化类的问题

    先上java代码: public class TUtil { public static T getT(Object o, int i) { try { return ((Class) ((Param ...

  10. java 父类获取子类对象_Java多态性详解 (父类引用子类对象)

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

最新文章

  1. ios 常用数学函数
  2. 实用:Google Chrome 键盘快捷键大全
  3. ABAP 选择屏幕上添加按钮,按钮上添加文字和图片
  4. Python脚本如何生成Windows可执行文件.exe
  5. MSMQ消息队列安装
  6. JavaFX 中使用多线程与保证 UI 线程安全
  7. 北方大学 ACM 多校训练赛 第十五场 欢度6.18
  8. 使用Apriori进行关联分析(一)
  9. 第2关:子节点创建、列出、删除
  10. jquery-ajax请求.NET MVC 后台
  11. 调度域(Scheduling Domain)
  12. html播放器滚动字幕,HTML 滚动字幕
  13. matlab 函数最大值位置,matlab中,两个自变量的函数怎么求最大值(急急急急!!1)...
  14. 乐理基础:五线谱读谱(1)
  15. C语言基础级——N维数组定义与使用
  16. 成就系统工程师的职业生涯
  17. 2021年数学建模国赛B题优秀论文(Word)(04烯焼制备分析与试验设计)
  18. java容器doc_java容器组件
  19. 【FPGA】五、蜂鸣器播放音乐
  20. 如何在mysql官网下载mysql最新或者以前的版本

热门文章

  1. 增强迪基-福勒检验(ADF检验、augmented Dickey-Fuller test)是什么?解决了什么问题?
  2. pandas计算滑动窗口中的最小值实战(Rolling Minimum in a Pandas Column):计算单数据列滑动窗口中的最小值、计算多数据列滑动窗口中的最小值
  3. R语言ggplot2可视化:箱图(box plot)可视化并且在为箱图的异常值(outlier)添加数据标签
  4. B树和B+树分别是什么?区别在哪里?MySQL使用的是哪一种树?
  5. R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出、保留数据点形状图例输出
  6. 机器学习数据预处理之缺失值:预测填充(回归模型填充、分类模型填充)
  7. R可视化散点图并进行特殊目标样本点的标记
  8. 生存分析-从survdiff函数中提取P值
  9. RACER: Rapid and accurate correction of errors in reads 快速、准确地修正读数中的错误
  10. 基因组组装(Genome Assembly)