反射笔记-----------------------------

1.反射基本概念:

 

01.定义:

反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性!

 

 

02.作用:

001.在运行期间获取类的修饰符,包名,类名,实现的接口,继承的父类。

002.在运行期间获取类的所有属性名,修饰符,属性类型。

003.在运行期间获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型。

004.在运行期间加载类的方法。

 

 

03.java反射API常用的类

001.java.lang.Class

002.java.lang.reflect.Method

003.java.lang.Constructor

004.java.lang.Filed

005.java.lang.Modifier

2.例子

01.使用java反射获取类的信息

001.父类代码

复制代码
package cn.pb.bean;/*** 父类* * @author Administrator* */
public class FatherTest {private String teststr = "测试用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
复制代码

002.子类代码

复制代码
package cn.pb.bean;/*** 测试类 人类  继承了父类*/
import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;}}
复制代码

003.测试类代码:

复制代码
package cn.pb.test;/*** 测试类 通过反射获取类的信息* * @author Administrator* */
public class GetClassInfo {public void test(String className) throws Exception {// 获取Person类对象 传递的className为类的全类名Class clazz = Class.forName(className);// 获取类在的包名 clazz.getSimpleName():获取类名Package pkg = clazz.getPackage();System.out.println(clazz.getSimpleName() + "定义在" + pkg.getName()+ "包中!");System.out.println("*********************");// 获取此对象所表示的实体(类,接口,基本类型或者void)的超类Class// 如果此对象是一个Object类,一个接口,一个基本类型或void,它的超类返回Null// 如果此对象是一个数组类,返回表示Object类的Class对象Class superClass = clazz.getSuperclass();System.out.println(clazz.getSimpleName() + "的超类是"+ superClass.getName());System.out.println("*********************");// 获取Person类所实现的接口// 如果Person类没有实现任何接口,返回一个长度为0的数组// 如果Person类是一个基本类型或者是void,那么也返回一个长度为0的数组Class[] interfaces = clazz.getInterfaces();System.out.println("所实现的接口有:");for (Class c : interfaces) {System.out.println(c.getName());}System.out.println("******************");}public static void main(String[] args) throws Exception {GetClassInfo getClassInfo = new GetClassInfo();getClassInfo.test("cn.pb.bean.Person");}}
复制代码

02.使用java反射获取类的构造函数的参数列表,并通过构造函数实例化类

001.父类代码

复制代码
package cn.pb.bean;/*** 父类* * @author Administrator* */
public class FatherTest {private String teststr = "测试用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
复制代码

 

002.子类代码

复制代码
package cn.pb.bean;/*** 测试类 人类  继承了父类*/
import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通过无参构造实例化Person对象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通过有参构造实例化Person对象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
复制代码

 

003.测试代码

复制代码
package cn.pb.test;import java.lang.reflect.Constructor;/*** 使用java反射获取类的构造函数的参数列表,并通过构造函数实例化类* * @author Administrator* */
public class GetClassConstructorInfo {/*** 通过反射实例化类的对象* * @throws Exception*/public void test1() throws Exception {// 参数calssName,为类的全类名Class clazz = Class.forName("cn.pb.bean.Person");// 通过clazz.newInstance()方法,获取类的实例Object obj = clazz.newInstance();System.out.println("通过反射实例化的对象:" + obj);}/*** 通过反射获取类的构造函数* * @throws Exception*/public void test2() throws Exception {// 参数calssName,为类的全类名Class clazz = Class.forName("cn.pb.bean.Person");// 获取类的构造函数,返回类的所有公共的构造函数Constructor[] constructors = clazz.getConstructors();System.out.println(clazz.getSimpleName() + "类的公共的构造函数以及构造函数的参数列表类型:");for (Constructor constructor : constructors) {System.out.println("构造函数的名称为:" + constructor.getName());// 获取构造函数的所有参数Class[] params = constructor.getParameterTypes();if (params.length == 0) {System.out.println("此构造函数没有参数!");} else {System.out.println("该构造函数的参数列表为:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}}// 获取无参构造,如果参数为空,则获取无参构造Constructor constructor = clazz.getConstructor();// 通过无参构造方法获取类的实例Object obj = constructor.newInstance();System.out.println("通过无参构造实例化的对象为:" + obj);/*** 获取有参构造 这个方法只能获得公共的有参构造 想要获取私有的构造方法 可以使用* clazz.getDeclaredConstructor(int.class, String.class, String.class,* String.class);方法*/Constructor constructor2 = clazz.getConstructor(int.class,String.class, String.class, String.class);Object obj2 = constructor2.newInstance(12, "xiix", "hah", "wawa");System.out.println("通过有参构造实例化的 对象为:" + obj2);}public static void main(String[] args) throws Exception {GetClassConstructorInfo test = new GetClassConstructorInfo();// test.test1();test.test2();}
}
复制代码

 03.使用java反射获取类的所有方法的信息,并调用类的setter方法进行属性的赋值

 

001.父类代码

复制代码
package cn.pb.bean;/*** 父类* * @author Administrator* */
public class FatherTest {private String teststr = "测试用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
复制代码

 

002.子类代码

复制代码
package cn.pb.bean;/*** 测试类 人类  继承了父类*/
import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通过无参构造实例化Person对象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通过有参构造实例化Person对象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
复制代码

 

003.测试代码

复制代码
package cn.pb.test;/*** 使用java反射获取类的所有方法的信息,并调用类的setter方法进行属性的赋值*/
import java.lang.reflect.Method;public class GetClassMethodsInfo {/*** 调用类的setter方法进行属性的赋值* * @param className*            类的全类名* @param propName*            属性名* @param propType*            属性类型* @param propValue*            属性值* @throws Exception*/public void invokeSetter(String className, String propName,String propType, Object propValue) throws Exception {// 通过反射获取类的实例Class clazz = Class.forName(className);Object obj = clazz.newInstance();// 将传过来的属性名 转换成set方法String methodName = "set" + propName.substring(0, 1).toUpperCase()+ propName.substring(1);// 根据set方法名和参数列表获取set方法Method method = clazz.getDeclaredMethod(methodName,Class.forName(propType));// 如果需要可以设置setAccessible方法,设置为可以访问// method.setAccessible(true);// 调用方法并传参 参数为:方法所属的对象和方法的参数method.invoke(obj, propValue);//System.out.println("通过set方法给类的属性赋值:" + obj);}/*** 使用java反射获取类的所有方法的信息*/public void showMethods() throws Exception {Method[] methods;// 获取Person类中的所有的方法,不包括继承的类的方法// 如果该类或接口没有生命任何方法,或者此Class 对象表示一个基本数据类型,一个数组类或void// 那么返回一个长度为0的数组methods = Class.forName("cn.pb.bean.Person").getDeclaredMethods();System.out.println("******展示方法信息********");for (Method method : methods) {System.out.println("方法名:" + method.getName());System.out.println("方法返回值类型:" + method.getReturnType().getName());// 获取方法的参数列表Class[] params = method.getParameterTypes();if (params.length == 0) {System.out.println("该方法没有参数!");} else {System.out.println("该方法的参数列表为:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}// 获取方法所属的类或接口的class对象Class declaringClass = method.getDeclaringClass();System.out.println("方法声明在:" + declaringClass.getName() + "中!");// 获取方法抛出的异常的类型,即throws子句中声明的异常Class[] exceptions = method.getExceptionTypes();if (exceptions.length > 0) {System.out.println("该方法抛出的异常有:【");for (int i = 0; i < exceptions.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(exceptions[i].getName());}System.out.println("】");}System.out.println("***********************");}}public static void main(String[] args) throws Exception {GetClassMethodsInfo test = new GetClassMethodsInfo();// test.invokeSetter("cn.pb.bean.Person", "name", "java.lang.String",// "zhangsan");test.showMethods();}
}
复制代码

 

 04.使用java反射获取类的所有属性的名称和类型,并为其中一个属性赋值

001.父类代码

复制代码
package cn.pb.bean;/*** 父类* * @author Administrator* */
public class FatherTest {private String teststr = "测试用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
复制代码

 

002.子类代码

复制代码
package cn.pb.bean;/*** 测试类 人类  继承了父类*/
import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通过无参构造实例化Person对象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通过有参构造实例化Person对象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
复制代码

 

003.测试代码

复制代码
package cn.pb.test;import java.lang.reflect.Field;/*** 使用java反射获取类的所有属性的名称和类型,并为其中一个属性赋值* * @author Administrator* */
public class GetClassFieldsInfo {/*** 使用java反射获取类的所有属性的名称和类型* * @throws Exception*/public void showFields() throws Exception {Field[] fields;// 获取Person类中的所有字段,但不包括继承的字段// 如果该类或接口不声明任何字段,或者此Class 对象表示一个基本数据类型,一个数组类或void// 那么返回一个长度为0的数组fields = Class.forName("cn.pb.bean.Person").getDeclaredFields();// 遍历System.out.println("**********字段展示***********");for (Field field : fields) {System.out.println("字段名:" + field.getName());System.out.println("字段类型:" + field.getType().getName());System.out.println("********************");}}/*** 通过使用反射操作person类的字段 使用java反射获取类的对象的实例,并为其中一个属性赋值*/public void accessField() throws Exception {// 通过反射加载一个Person实例Class clazz = Class.forName("cn.pb.bean.Person");Object obj = clazz.newInstance();// 通过getDeclaredField("address")方法 获取类的指定字段Field address = clazz.getDeclaredField("address");// address字段为private,这里已经超出其访问范围,不能直接访问// 通过setAccessable方法,设定为可以访问address.setAccessible(true);System.out.println("赋值前的address:" + address.get(obj));// 为address属性赋值address.set(obj, "北大青鸟");System.out.println("赋值之后的address:" + address.get(obj));}public static void main(String[] args) throws Exception {GetClassFieldsInfo test = new GetClassFieldsInfo();test.showFields();test.accessField();}}

转载于:https://www.cnblogs.com/laosunlaiye/p/7679337.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes 集群部署

kubernetes 集群部署 环境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已开通 4C8G80G 集群规划 部署方式 环境准备&#xff1a;基于主机名称通信&#xff0c;时间同步&#xff0c;关…

wordpress 显示数学公式 (MathJax-LaTeX)

blog 不放一堆数学公式怎么能显得高大上&#xff0c;所以 MathJax-LaTeX 也是必装的插件之一了。 一、安装 MathJax-LaTex 插件 直接在 wordpress 插件中&#xff0c;搜索并安装 MathJax-LaTeX 二、安装本地 MathJax 服务 不过由默认的 MathJax cdn 服务经常被墙&#xff0c;所…

ConstraintLayout

ConstraintLayout使用笔记 具体使用参考&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好处还是很明显&#xff0c;确实可以减少嵌套。性能对比参阅&#xff1a;http://www.cnblogs.com/liujingg/p/7161319.html 简单嵌套Constrain…

python(5)- 基础数据类型

一 int 数字类型 #abs(x)      返回数字的绝对值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回数字的上入整数&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

基于HTK的语音拨号系统

为什么80%的码农都做不了架构师&#xff1f;>>> 基于 HTK 的语音拨号系统 Veket NWPU 2011-6-22 目标&#xff1a; 该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL无法重启问题解决Warning: World-writable config file '/etc/my.cnf' is ignored

为什么80%的码农都做不了架构师&#xff1f;>>> 今天帮朋友维护服务器&#xff0c;在关闭数据库的命令发现mysql关不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是权限全局可写&#xff0c;任何一个用户都…

用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例

基于实例分析&#xff0c;体会用户体验设计的 7 条准则&#xff0c;分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得满意的地方&#xff08;不少于2点&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;请陈述理由。 同样&#xff0c;分析…

JVM学习笔记(一):Java内存区域

由于Java程序是交由JVM执行的&#xff0c;所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前&#xff0c;先来看一下Java程序具体执行的过程&#xff1a; 首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)&am…

EdgeRouter X设置外网远程访问和HTTPS连接指定出口网关

EdgeRouter X虽然小巧&#xff0c;但功能强大&#xff0c;为方便远程管理&#xff0c;必须对防火墙进行设置&#xff0c;允许从外部进行访问&#xff0c;由于公网的80、443端口都已被运营商关闭&#xff0c;必须设置端口转发才能从外部访问。一、设置外网远程访问通过浏览器进入…

CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]

为什么80%的码农都做不了架构师&#xff1f;>>> /// <summary> /// CSV出力ボタンラッパー。 /// </summary> public class CsvOutputButtonWrapper { /// <summary> /// CSV出力ボタン /// </summary> …

项目UML设计(团队)

团队信息 队名&#xff1a;massivehard 组长&#xff1a;晓辉 队员&#xff1a;一飞&#xff0c;帅珍&#xff0c;斌豪&#xff0c;锦谋 团队分工 模块序号模块名模块具体内容1日记编辑添加随笔2照片选择选择照片识别3消息模块收发消息4个人信息账号&#xff0c;密码等负责人分…

安装asp.net mvc4后mvc3项目编译报错

为什么80%的码农都做不了架构师&#xff1f;>>> 安装asp.net mvc4之后&#xff0c;之前的mvc3项目编译时报这个错“The type System.Web.Mvc.ModelClientValidationRule exists in both c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.M…

POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

为什么80%的码农都做不了架构师&#xff1f;>>> POJ 3608 Bridge Across Islands跨岛大桥&#xff1a;在两个凸包小岛之间造桥&#xff0c;求最小距离&#xff1f;3.6与平面和空间打交道的计算几何 凸包 这题原始数据已经是凸包&#xff08;convex polygons&#x…

抓包(Charles工具入门)

一、charles工具简单使用 1、录制操作 录制请求、清空录制请求&#xff1a; 两种展示请求的视图方式&#xff1a; 2、录制请求的简单分析 &#xff08;1&#xff09;请求的总览页面Overview&#xff1a;可查看请求路径、请求方式、请求时间等有关该请求的内容 &#xff08;2&am…

探秘创造力

为什么80%的码农都做不了架构师&#xff1f;>>> 创造力&#xff0c;在很多行业和领域都被视为神奇的存在&#xff0c;大家都希望自己的创造力能够无限&#xff0c;感觉创造力已经被神话了。其实&#xff0c;一个简单问题可能很少人能够明确&#xff1a;”创造力是天…

Chrome Android 60.X+ 不能自动播放audio音频的解决办法

Chrome Android等一些浏览器默认限制了自动播放音频视频等&#xff0c;需要用户有点击的动作后才可以播放。这样的原因在于很多用户流量需要付费&#xff0c;而限制了自动播放可以避免用户在不知情的情况下产生高额的流量费用。 在60.X版本之前&#xff0c;chrome://flags中有一…

框架设计:实现数据的按需更新与插入的改进--用数据对比进一步说明

2019独角兽企业重金招聘Python工程师标准>>> 在发布完&#xff1a;框架设计&#xff1a;实现数据的按需更新与插入的改进 之后&#xff1a; 有网友表示不理解&#xff0c;于是这里给出一篇简单的说明对比&#xff0c;表示下改进后好处。 一&#xff1a;场景一&#…

Java异常详解及如何处理

来源&#xff1a;Java异常详解及如何处理 简介 程序运行时&#xff0c;发生的不被期望的事件&#xff0c;它阻止了程序按照程序员的预期正常执行&#xff0c;这就是异常。异常发生时&#xff0c;是任程序自生自灭&#xff0c;立刻退出终止&#xff0c;还是输出错误给用户&…

TransactionScope 的基本原理简介

C# 的事务编程 1 Db事务 DbConnection 中创建基于当前连接的 DbTransaction 2 使用TransactionScope ,创建环境事务 一旦创建&#xff0c;在这个环境包含的DbConnection 实例 都会根据连接字符串中的 Sqlserver 连接字符串支持&#xff0c;是否自动附加当前环境事务. 连接字符…

Canvas 生成交互动画

2019独角兽企业重金招聘Python工程师标准>>> 今天介绍的是一个HTML5交互动画效果&#xff0c;难以置信。HTML5虽说还有很多东西在改进&#xff0c;但现在所能实现的 效果的程度我想是诸位很难想象得到的&#xff0c;实在是发展得太快了。 查看详情 转载于:https://m…