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

反射笔记-----------------------------相关推荐

  1. Static关键字解析以及反射笔记之一

    Static关键字解析以及反射笔记之一 Java中的static关键字解析 一.static关键字的用途 以下是关于反射的一些笔记与思考 Java中的static关键字解析 static关键字是很多朋 ...

  2. java反射随意值_Java反射笔记

    Java反射 反射库提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵Java代码的程序.能够分析类能力的程序称为反射(reflective).反射机制的功能极为强大,反射机制可以用来: 在运行时 ...

  3. 反射--笔记(第一篇)

    直接代码理解 主要说明:反射的三种方式,反射方法.调用方法 public static void main(String[] args) throws Exception {getClassWays( ...

  4. java反射为什么消耗资源_Java反射笔记

    第一:先认识Class类 类也是一种实例,类的实例创建有三种方式. 类的实例对象创建的方式有两种.以下的代码详细的介绍: packagecom.company;import java.util.*;p ...

  5. java反射 pdf_java反射学习笔记整理.pdf

    java反射学习笔记整理.pdf 还剩 15页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: Java 反射笔记 ...

  6. javacode基本概念语法--学习笔记

    javacode学习笔记大纲 一.语法规范 二.键盘输入 三.数据类型分类及类型转换 四.局部变量.switch-case.随机数 五.函数 六.数组 1.基础概念 2.数组扩容及排序 3.保留小数( ...

  7. C#基础系列——Attribute特性使用

    前言:上篇 C#基础系列--反射笔记 总结了下反射得基础用法,这章我们来看看C#的另一个基础技术--特性. 1.什么是特性:就博主的理解,特性就是在类的类名称.属性.方法等上面加一个标记,使这些类.属 ...

  8. 知识累积——这些年写过的博文(博客目录索引)

    阅读目录 一.JavaScript系列 1.Bootstrap组件系列 2.JavaScript效果系列 3.JavaScript组件扩展与封装 4.Knockout组件系列 5.Vue组件系列 二. ...

  9. 异步编程初探:async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了 ...

最新文章

  1. Nginx(二) 虚拟主机配置
  2. Eclipse 导入 Tomcat 源码
  3. ajax delete gin 获取不到_《Gin 文档》之路由篇
  4. java里冒泡排序编程案例_java编程题:用Java实现一个冒泡排序算法
  5. 用 GRUB 引导自己的操作系统
  6. 编写一个基本的Android程序
  7. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  8. 学会针对永洪API接口的性能测试,工作效率提升百倍
  9. php调http接口,2步教你解决http协议php接口调用
  10. 【数据结构与算法】之深入解析“预测赢家”的求解思路与算法示例
  11. 单例模式android应用场景,应用最广的模式-单例模式(结合Android源码)
  12. 4G模组工作笔记001---NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程
  13. mysql怎么保证热点数据_MySQL里有2000w数据,redis中只存20w数据,如何保证redis中数据都是热点数据...
  14. pytorch深度学习基础总结
  15. python蓝桥杯跑步训练
  16. Java三大器之过滤器(Filter)的工作原理和代码演示
  17. oracle的exp程序,数据库expimp迁移的整个过程,及注意事项
  18. hololens与混合现实开发pdf_增强现实与虚拟现实:过去和未来
  19. 理解 __doPostBack--2
  20. 使用番茄助手 快速注释

热门文章

  1. php图片显示框,【转】php让图片弹出下载框的方法
  2. 查看linux文件系统结构,如何查看Linux系统架构类型
  3. java浮点数存储方式_Java浮点数内存存储
  4. html修改原生checkbox选中的颜色_[三分钟小文]前端性能优化-HTML、CSS、JS部分
  5. CF--思维练习-- CodeForces - 215C - Crosses(思维题)
  6. 网络流--最大流--POJ 1273 Drainage Ditches
  7. 数据结构-线性表之顺序表
  8. class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text
  9. 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录
  10. 玩转mini2440开发板之【如何设置开发板的网络参数】