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的理解(二)——反射是小偷的万能钥匙
在我们生活中,车上或者路上有时候会遇到一种很讨厌的人——“小偷”,趁我们不注意或者疏忽的时候拿走属于我们的东西.更有甚者,趁我们不在家的时候,手持一把万能钥匙,打开我们的房门,悠闲的查看房间的布置,翻 ...
随机推荐
- 动态改变actionbar上menu的图标
工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色.实现后在这里总结下思路. 一.先在主题中定义好Actionbar的style <style name="App ...
- 使用ContentProvider访问其他应用的SharedPreferences数据
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs ...
- Android SharedPreference的使用
在<Android 在内部存储读写文件>一文中,谈到了登录用户名和密码的方法,通过读取内存文件来实现,但是会出现问题,因为登录名和密码的形式通过username##password的形式, ...
- iOS---检测系统通知开关状态
if (iOS8) { //iOS8以上包含iOS8 if ([[UIApplication sharedApplication] currentUserNotificationSettings].t ...
- 安卓开发之UIwebview
web view在安卓开发中是比较常见的UI,像微信的新闻模块就采用了这个,他的作用越来越广,下面我把以前做的贴了出来,如果有更好的办法,希望大神不吝赐教哈,嘿嘿,纯代码来了: java代码 publ ...
- iOS带动画的环形进度条(进度条和数字同步)
本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...
- C#复习②
C#复习② 2016年6月15日 09:08 1.C#之Symbols Identifier = (letter|'_'|'@'){letter|digit|'_'}. 需要注意: 1.Unicode ...
- FATAL ERROR: Could not find ./bin/my_print_defaults的解决办法
对mysql数据库初始化过程中,会有如下报错信息: 1 2 3 4 5 6 7 [root@localhost scripts]# ./mysql_install_db --user=mysql FA ...
- head,tail
测试文件headtail 1 L 2 L 3 L 4 L 5 L 6 L 7 L 8 L 9 L 10 L 11 L 12 L 13 L 14 L 15 L 16 L 17 L 18 L 19 L h ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...