声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223

反射二 利用反射创建对象

1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函数,带参数的构造函数,私有的构造函数,如下,创建一个Person类:

  1. package study.reflect;
  2.  
  3. import java.util.List;
  4.  
  5. public class Person
  6.  
  7. {
  8.  
  9. /**
  10.  
  11. * 为了测试用
  12.  
  13. */
  14.  
  15. public String name = "test";
  16.  
  17. public Person()
  18.  
  19. {
  20.  
  21. }
  22.  
  23. public Person(String name)
  24.  
  25. {
  26.  
  27. System.out.println("name:"+name);
  28.  
  29. }
  30.  
  31. public Person(String name,int age)
  32.  
  33. {
  34.  
  35. System.out.println("name:"+name+",age:"+age);
  36.  
  37. }
  38.  
  39. private Person(List list)
  40.  
  41. {
  42.  
  43. System.out.println("list");
  44.  
  45. }
  46.  
  47. }

2.利用反射创建出我们的Person类的实例,为了测试,因此上面在Person中有一个属性为public String name = "test"; 如果创建不出对象,那么会出现空指针现象。

代码如下:

  1. package study.reflect;
  2.  
  3. import java.lang.reflect.Constructor;
  4.  
  5. import java.util.ArrayList;
  6.  
  7. import java.util.List;
  8.  
  9. import org.junit.Test;
  10.  
  11. /*
  12.  
  13. * 利用反射解析出构造函数,使用构造函数创建对象
  14.  
  15. */
  16.  
  17. public class Demo02
  18.  
  19. {
  20.  
  21. @Test
  22.  
  23. public void test01() throws Exception
  24.  
  25. {
  26.  
  27. Class<?> clazz = Class.forName("study.reflect.Person");
  28.  
  29. Constructor constructor = clazz.getConstructor(null);
  30.  
  31. Person person = (Person) constructor.newInstance(null);
  32.  
  33. System.out.println(person.name);
  34.  
  35. }
  36.  
  37. @Test
  38.  
  39. public void test02() throws Exception
  40.  
  41. {
  42.  
  43. Class<?> clazz = Class.forName("study.reflect.Person");
  44.  
  45. Constructor constructor = clazz.getConstructor(String.class);
  46.  
  47. Person person = (Person) constructor.newInstance("hello");
  48.  
  49. System.out.println(person.name);
  50.  
  51. }
  52.  
  53. @Test
  54.  
  55. public void test03() throws Exception
  56.  
  57. {
  58.  
  59. Class<?> clazz = Class.forName("study.reflect.Person");
  60.  
  61. Constructor constructor = clazz.getConstructor(String.class,int.class);
  62.  
  63. Person person = (Person) constructor.newInstance("hello",123);
  64.  
  65. System.out.println(person.name);
  66.  
  67. }
  68.  
  69. @Test
  70.  
  71. public void test04() throws Exception
  72.  
  73. {
  74.  
  75. Class<?> clazz = Class.forName("study.reflect.Person");
  76.  
  77. Constructor constructor = clazz.getDeclaredConstructor(List.class);
  78.  
  79. constructor.setAccessible(true);
  80.  
  81. Person person = (Person) constructor.newInstance(new ArrayList());
  82.  
  83. System.out.println(person.name);
  84.  
  85. }
  86.  
  87. }

3.若想通过类的不带参数的构造方法来生成对象,我们有两种方式:

(1)通过上面说的构造函数的方式反射出对象;(2)1.先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:

Class<?> classType = String.class;

  Object obj = classType.newInstance();

JAVA中反射机制二的更多相关文章

  1. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  2. JAVA中反射机制一

    反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...

  3. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  4. JAVA中反射机制五(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  5. JAVA中反射机制六(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  6. JAVA中反射机制四

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...

  7. JAVA中反射机制三

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射三 利用反射获取对象的方法,并调用方法 1.利用反射获取对象的方法,我们仍然利用上面的Person类, ...

  8. JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  9. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...

随机推荐

  1. GIT团队实战博客

    项目要求 组长博客 遇到的困难及解决办法 组员1(组长):王彬 遇到的困难  在团队任务分工的时候没有充分照顾到所有人,导致队员们的工作量不均. 现场编程时间不够 解决办法 在此对组员们表示抱歉,由于 ...

  2. sql主表分页查询关联子表取任意一条高效方案

    有个业务场景,主表中一条数据,在子表中有多条详情数据.对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好. sql查询取子表任意一条,多个字段的方案 最终找到一 ...

  3. haproxy调度算法

    调度算法详解 用balance指令指明调度算法, 例如:balance roundrobin   1:roundrobin :动态轮询算法,基于后端服务器的总权重做轮询,后端的服务器数量限制在4095 ...

  4. PAT 甲级 1144 The Missing Number

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343463260160 Given N integers, you ...

  5. SQLSERVER数据集合的交、并、差集运算(intersect,union,except)

    SQLServer中通过intersect,union,except和三个关键字对应交.并.差三种集合运算. 他们的对应关系可以参考下面图示 测试示例: 构造A,B两个数据集 A:,,, B:,, W ...

  6. 【C++】new和delete表达式与内存管理

    new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...

  7. 第194天:js---函数对象详解(arguments、length)

    一.函数即对象 function add1(a,b){ return a+b; } //Function对象的实例 -- 高级技巧 --- 写框架必须用的... //前面表示参数,后面表示函数语句 v ...

  8. BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)

    kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...

  9. 【比赛】HNOI2018 毒瘤

    虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll ...

  10. BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...