通过反射创建对象的两种方法:

  1. 通过Class字节码对象newInstance();(默认通过无参构造创建)

  2. 通过获取构造器getConstructor(Class<?>…parameterTypes);(通过有参的构造器,参数可以指定具体类型和多个数量)

代码:

假设我们有一个用户类User

package test.java.zxj.test_project;public class User {private String userId;private String name;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

此时没有自定义构造参数,只有默认的无参构造;

通过反射可以直接创建对象

package test.java.zxj.test_project;public class TestReflection {public static void main(String[] args) throws Exception {Class<?> clz = Class.forName("test.java.zxj.test_project.User");Object object = clz.newInstance();System.out.println(object instanceof User);}}

打印结果为true;

这种clz.newInstance()的方式,只能创建默认无参构造的对象;

对于有参构造的对象怎么创建呢?

还是这个User,我们加上带参数的构造;

package test.java.zxj.test_project;public class User {private String userId;private String name;public User() {}public User(String userId, String name) {super();this.userId = userId;this.name = name;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

这时候我们需要通过获取构造器,来创建对象:

package test.java.zxj.test_project;import java.lang.reflect.Constructor;public class TestReflection {public static void main(String[] args) throws Exception {Class<?> clz = Class.forName("test.java.zxj.test_project.User");//获取参数为<String,String>的构造器Constructor<?> constructor = clz.getConstructor(String.class, String.class);Object object = constructor.newInstance("userId_001","name_jack");
//      System.out.println(object instanceof User);if (object instanceof User) {User user = (User)object;System.out.println("userId:" + user.getUserId());System.out.println("name:" + user.getName());}}}

可以打印出结果

userId:userId_001
name:name_jack

注意:这里获取构造器只能获取public的,对于私有的需要暴力反射

constructor.setAccessible(true);

如何通过反射创建对象相关推荐

  1. java 反射创建对象并赋值_java使用反射创建并操作对象的方法

    Class 对象可以获得该类里的方法(由 Method 对象表示).构造器(由 Constructor 对象表示).成员变量(由 Field 对象表示),这三个类都位于 java.lang.refle ...

  2. 通过反射创建对象和调用方法

    1.反射创建对象,该对象有一个无参的构造方法 //reflect.User表示User类的全路径 User user = (User) Class.forName("reflect.User ...

  3. 反射创建对象_面试题汇集——java反射

    反射是动态获取信息以及动态调用对象的方法,在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法. 1.除了使用new创建对象之外,还可以用 ...

  4. java 反射 对象的方法_java通过反射创建对象并调用方法

    这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用户类 package com.lf.ent ...

  5. 通过反射创建对象的几种方式

    通过反射创建对象的几种方式 public static void main(String args []) throws Exception {//这个是获得cat类的类对象.Class catcls ...

  6. Java通过反射创建对象

    (转载)http://j2megame.blog.163.com/blog/static/140838396201141623654269/ java可以在运行时动态获取某个类的类信息,这就是java ...

  7. Java 反射方法的运用(通过反射创建对象)

    Java 的反射 涉及到的知识:1.通过反射创建对象:2.通过反射调用某个类的方法. 这篇主要是讲解 通过反射创建对象 一.反射的简单定义:java可以在运行时动态获取某个类的类信息,这就是java的 ...

  8. 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...

  9. 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...

最新文章

  1. PHP一些十分严重的缺陷
  2. 让bug无处藏身,Java 线上问题排查思路、常用工具
  3. 全网最强Python版《超级玛丽》小游戏,我还是你的马里奥嘛?
  4. 杂项-Java:JSP
  5. ubuntu系统写路由指令_在Ubuntu中如何查看网络路由表详解,
  6. 一个奇怪的问题:tomcat 栈溢出 StackOverflowError错误
  7. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法
  8. SQL Server之旅:(二)Could not load the DLL xpstar90.dll
  9. Python 实用技巧
  10. Unicdoe【真正的完整码表】对照表(二)汉字Unicode表
  11. java程序设计基础_陈国君版第五版_第十章习题
  12. Linux下的经典软件
  13. 双足机器人Maltab腿部建模,正运动学分析
  14. K近邻法(KNN)与k-Means的区别
  15. 【prometheus+alertmanager告警管理】
  16. 大局观有多重要?如何拥有大局观?
  17. length和length()的区别
  18. 图形编辑器:拖拽阻塞优化
  19. 【解决】Splunk Lookup table owner: nobody
  20. 地平线开发者社区真心话大冒险,邀你闯关!

热门文章

  1. HTML5学习笔记简明版(5):input的type超级类型
  2. [C++ primer]运行时类型识别(RTTI)
  3. linux 下安装adobe flash的关键。
  4. 《设计模式详解》行为型模式 - 备忘录模式
  5. 【SSM 整合项目】图书管理系统
  6. mysql数据库自动关闭
  7. CIO们拼命都想上的“网红”中台,也有它的另一面
  8. 跨语言之间的socket通信(C--Java的握手)(基础篇转)
  9. leetcode hot 1-2
  10. vue的main.js讲解一