java 27 - 3 反射之 通过反射获取构造方法并使用
类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限。
通过反射的方法获取构造方法并使用 ps:先忽略泛型
A.1:获取构造方法的数组:
public Constructor<?>[] getConstructors():获得所有公共构造方法
public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
A.2:获取单个构造方法(用于非私有的构造方法)
public Constructor<T> getConstructor(Class<?>... parameterTypes)
参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
A.3:获取单个构造方法(用于私有的构造方法)
public Constructor<T> getDeclaredtConstructor(Class<?>... parameterTypes)
B.1:初始化构造方法的实例:(用于非私有的构造方法)
public T newInstance(Object... initargs) 注意:T表示的是泛型,Object... initargs表示的是你要实例化的指定参数
使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
B.2:初始化构造方法的实例:(用于私有的构造方法)
先用: public void setAccessible(boolean flag):flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
再用: public T newInstance(Object... initargs)
代码:
A:public Constructor<?>[] getConstructors():获得所有公共构造方法
Constructor[] c1 = c.getConstructors();
System.out.println(c1);// 返回的是地址值,证明得到的是个数组对象
// 遍历这个数组
for (Constructor ct : c1) {
System.out.println(ct);
} //获得Person类中的所有公告构造方法
B:public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
// B:public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
Constructor[] c1 = c.getDeclaredConstructors();
//遍历数组
for(Constructor ct : c1){
System.out.println(ct);
} //获得Person类的所有构造方法
C:public Constructor<T> getConstructor(Class<?>... parameterTypes):获得指定的构造方法
获得无参构造方法:
Constructor c1 = c.getDeclaredConstructor();
System.out.println(c1);
获得带参构造方法:
//获取指定的构造方法,需要该方法的参数列表
Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class);
System.out.println(c1);
D:public T newInstance(Object... initargs) 注意:T表示的是泛型,Object... initargs表示的是你要实例化的指定参数
使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
也就是初始化对象
通过反射获取公共带参构造方法并使用:
//获取指定的构造方法,需要该方法的参数列表
Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class);
System.out.println(c1); // 通过带参构造方法对象创建对象
// public T newInstance(Object... initargs):
//有泛型,前面没使用泛型,先用Objcet
Object b = c1.newInstance("张三",13,"家乡");
System.out.println(b); //Person [name=张三, age=13, address=家乡]
通过反射获取私有带参构造方法并使用:
//获取指定的私有构造方法
Constructor c1 = c.getDeclaredConstructor(String.class); //public void setAccessible(boolean flag):
//flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
c1.setAccessible(true); // public T newInstance(Object... initargs)
Object ob = c1.newInstance("张三");
System.out.println(ob);
后两个代码,相当于以前的: 只不过通过反射,不需要导入对应的类
public Person(String name, int age, String address) Person p = new Person("张三",13,"家乡");
System.out.println(p);
和
private Person(String name){} Person p = new Person("风清扬");
System.out.println(p);
java 27 - 3 反射之 通过反射获取构造方法并使用的更多相关文章
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...
- java 27 - 6 反射之 通过配置文件运行类中的方法
在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: public class Dog { public void eat() { S ...
- JAVA基础 (二)反射 深入解析反射机制
在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...
- Java 反射机制[Method反射]
Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- Java高级篇(四)——反射
之前写到了设计模式的代理模式,因为下一篇动态代理等内容需要用到反射的知识,所以在之前Java篇的基础上再写一篇有关反射的内容,还是以实际的程序为主,了解反射是做什么的.应该怎么用. 一.什么是反射 反 ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- Java之旅(2)—反射
1. 概念 反射就是将java类中的各种成分映射成对应的java类.之前我们已经讲过了Class类,也明确了一个java类中用一个Class类的对象来表示,一个类中的组成部分有:成员变量,方法 ...
- 我对java的理解(二)——反射是小偷的万能钥匙
在我们生活中,车上或者路上有时候会遇到一种很讨厌的人——“小偷”,趁我们不注意或者疏忽的时候拿走属于我们的东西.更有甚者,趁我们不在家的时候,手持一把万能钥匙,打开我们的房门,悠闲的查看房间的布置,翻 ...
随机推荐
- 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本
最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...
- HDOJ1001-1005题解
1001--Sum Problem(http://acm.hdu.edu.cn/showproblem.php?pid=1001) #include <stdio.h> int sum(i ...
- 【原】Mac下统计任意文件夹中代码行数的工具——cloc
这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...
- android 界面设计基本知识
一个好的APP不仅有美观,好看的界面,更需要良好的性能和稳定性.作为一名开发人员,需要理解界面设计原则并写出优秀的界面设计代码. 本章主要讲述基本控件的使用,界面布局及一些常用的界面设计属性. 1.常 ...
- C++ virtual虚函数
#include<iostream> using namespace std; class Base{ public: void m() { cout << "it' ...
- openstack security group and rules python api use
nova和neutron都可以,但是感觉还是用neutron好. import neutronclient.v2_0.client as neclient neutron = neclient.Cli ...
- [Linux 性能检测工具]DF
DF NAME: df 报告了文件系统的使用 语法: df [OPTION]... [FILE]... 描述: Df显示了以文件名为从参数查看所在文件系统的可用空间.如果没有指定文件那么会显示所有的文 ...
- MySQL-procedure(cursor,loop)
现有一张表spam_keyword,共629条记录,每条记录的word字段的字符数量不等. CREATE TABLE `spam_keyword` ( `kid` ) NOT NULL, `word` ...
- my_log
//功能:定时向文件中写入时间,如果进程终止,下次打开同一个文件会继续之前的编号书写 #include<stdio.h> #include<time.h> int main(i ...
- 省级联动(使用ajax实现)
在博客园学习了很多实用的东西,现在该慢慢开始自己写写博客文章, 由于本人水平有限,刚走出校园的小菜鸟,另外,文章在表述和代码方面如有不妥之处,欢迎批评指正.留下你 的脚印,欢迎评论! 有什么问题,可以 ...