构造器最大的作用:创建对象.

为什么使用反射创建对象,为什么不直接来new呢?

在框架中,提供给我们的都是字符串.

-----------------------------------------------------------

使用反射创建对象:

步骤:

1);找到构造器所在类的字节码对象.

2):获取构造器对象.

3):使用反射,创建对象

-----------------------------------------------------------

Constructor<T>类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器

常用方法:

publicT newInstance(Object... initargs):如调用带参数的构造器,只能使用该方式.

参数:initargs:表示调用构造器的实际参数

返回:返回创建的实例,T表示Class所表示类的类型

如果:一个类中的构造器是外界可以直接访问,同时没有参数.,那么可以直接使用Class类中的newInstance方法创建对象.

public Object newInstance():相当于new 类名();

调用私有的构造器:

注意:java.lang.IllegalArgumentException: wrong number of arguments表示如果你想获取的构造器为private那么通过getConstructor是会报上面的异常,改为getDeclaredConstructor

访问私有的成员:

必须先设置可访问的

对象setAccessible(true)

代码:

package com.test;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;public class Main {//获取指定的一个构造器public Main(){System.out.println("我是Main类无参的构造器");}public Main(int num){System.out.println(num);}private Main(String statement){System.out.println("我是带有一个String类型的参数的构造器"+ statement);}private Main(String str, int num){System.out.println("我是带有两个参数的构造器");}public static void main(String[] args) throws Exception {System.out.println("-----------反射调用构造器创建对象----------------");//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射创建对象//由于main(String..)为私有的因此,设置访问权限con.setAccessible(true);String str = "hello";con.newInstance(str);}
}

练习代码保存

package com.test;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;public class Main {//获取指定的一个构造器public Main(){System.out.println("我是Main类无参的构造器");}public Main(int num){System.out.println(num);}private Main(final String statement){System.out.println("我是带有一个String类型的参数的构造器");}private Main(String str, int num){System.out.println("我是带有两个参数的构造器");}private static void getAll(){//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器Constructor<?>[] cs = clz.getConstructors();System.out.println(cs.length);for (Constructor<?> c : cs) {System.out.println(c);}cs = clz.getDeclaredConstructors();System.out.println(cs.length);for(Constructor<?> c : cs){System.out.println(c);}}private static void getOne() throws NoSuchMethodException, SecurityException{//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器//需求1:获取public Main()Constructor<Main> con = clz.getConstructor();System.out.println(con);//需求2:获取public Main(String statement)con = clz.getDeclaredConstructor(String.class);System.out.println(con);//需求3:获取private Main(String str, int num)con = clz.getDeclaredConstructor(String.class, int.class);System.out.println(con);}public static void main(String[] args) throws Exception {System.out.println("---------类的实例------------------");//需求1:获取java.util.Date类的字节码对象//方式1:使用class属性Class<java.util.Date> clz1 =java.util.Date.class;//方式2:通过对象的getClass方法获取,getClass是Object类中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = date.getClass();//方式3:通过Class类中的静态方法foeName(String className)Class<?> clz3 = Class.forName("java.util.Date");System.out.println(clz1+"\n"+clz2+"\n"+clz3+"\n");System.out.println("----------获取类的构造器-----------------");getOne();System.out.println("-----------获取类的所有的构造器----------------");getAll();System.out.println("-----------反射调用构造器创建对象----------------");//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射创建对象//由于main(String..)为私有的因此,设置访问权限con.setAccessible(true);String str = "hello";con.newInstance(str);}
}

使用反射调用构造器创建对象相关推荐

  1. java中如何使用反射调用方法以及获得类中的属性

    使用反射获取类中的方法: 1):获取方法所在类的字节码对象. 2):获取方法. ------------------------------------------------------------ ...

  2. 反射_通过反射调用类中指定方法、属性

    一.调用指定方法 通过反射,调用类中的方法,通过Method类完成.步骤: 1.通过Class类的getMethod(String name,Class.......parameterTypes)方法 ...

  3. 注解和反射12.动态创建对象执行方法

    有了Class对象能做什么? 创建类的对象:调用Class对象的newInstance()方法 类必须有一个无惨的构造器 类的构造器访问权限需要足够 思考?难道没有无参构造器就不能创建对象了嘛?只要在 ...

  4. 在C++中反射调用.NET(二)

    反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...

  5. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)...

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  6. J2EE高级开发框架小课程之Spring框架1——Spring创建三种方式:使用无参构造器创建对象(bean标签的方式),使用静态方法创建对象,使用实例方法创建对象(非静态方法)

    Spring是什么? 是一个开源的.用于简化企业级应用开发的应用开发框架. a.简化开发: Spring框架对很多常用的api做了简化,比如,使用Spring jdbc (Spring jdbc是Sp ...

  7. Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  8. Java 反射 C 反射调用 java 方法

    1. Java 反射 1.1 创建 Demo.java 类 public class Demo {public void hello(String str){System.out.println(st ...

  9. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

最新文章

  1. Apache ZooKeeper - 使用原生的API操作ZK_ACL权限
  2. Angular应用内路由(In App Route)的最佳实践
  3. c语言在dos下执行bat文件,应用dos批处理文件经常用到的DOS常用命令
  4. [css] 在rem下如何实现1像素?
  5. 开发环境与工具部署服务_开发与部署之间的区别
  6. ajax js图片上传到php,Ajax上传并预览图片(附代码)
  7. Python数据科学平台Anaconda的最新发布中增加了Microsoft VS Code
  8. ssh mysql 命令_ssh mysql命令大全
  9. no plugin found for prefix ‘tomcat 7‘ in the current project and in the plugin groups的解决方法
  10. YII framework CComponent基础类解读(转)
  11. 在PPT设计中如何制作有效的图表?
  12. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_3_Stream流中的常用方法_filter...
  13. 昨晚我遇到了超级网红:区块链本人
  14. PS去除图片上的文字
  15. 线性代数让我想想:两步得到二阶矩阵的逆
  16. 农历php,php 阴历-农历-转换类代码
  17. 小白学SLAM的流水账(一):跑通ORB踩过的坑
  18. 【机器学习】五种超参数优化技巧
  19. csharp基础练习题:寻找恩人【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  20. pchip和spline区别

热门文章

  1. 青岛旅游学校计算机证书,【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜
  2. 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆
  3. java ldap添加用户名密码_java ldap用户密码md5加密
  4. python语言程序设计考试内容_MOOC_Python语言程序设计(嵩天)考试_第一周
  5. Java虚拟机组成详解
  6. java url headers,Java CloseableHttpResponse.getHeaders方法代码示例
  7. 云教版认识计算机说课,【教学设计】第1册第1课《认识电脑交朋友》
  8. html4基础,HTML 基础 4
  9. java商城_java网上商城系统怎么样?优势又有哪些?
  10. php web mysql数据库_使用php从web访问mysql