简介

反射是Java开发中一个非常重要的概念,掌握了反射的知识,才能更好的学习Java高级课程,因此必须要学习!本博客主要介绍Class类的使用,方法和成员变量的反射。

实体类User

package reflect;
public class User {// 属性定义private String name;public Integer age;// 无参构造方法public User(){super();}// 有参构造方法public User(String name, Integer age) {super();this.name = name;this.age = age;}// 定义普通方法public void say() {System.out.println("say方发:我叫" + name + "," + age + "岁了!");}// 定义重载方法public void say(String name, Integer age) {System.out.println("重载say方法:我叫" + name + "," + age + "岁了!");}// 私有方法private void desc() {System.out.println("我超甜!");}
}

获取User类对象

    @Testpublic void getClassObject() {try {// 第一种方式:通过类加载器(动态)Class userClassA = Class.forName("reflect.User");// 第二种方式:通过类Class userClassB = User.class;// 第三种方式:通过类的对象User user = new User();Class userClassC = user.getClass();// 查看三种方式得到的对象是否相同System.out.println(userClassA == userClassB && userClassB == userClassC);} catch (ClassNotFoundException e) {e.printStackTrace();}}   

结果:ture

获取User对象

    @Testpublic void getBean(){try {// 括号里面的写法很有讲究!User user = (User)Class.forName("reflect.User").newInstance("费哥",18);;user.say("费哥哥", 18);} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}

结果:重载say方法:我叫费哥哥,18岁了!

通过User类对象,获取方法信息

    @Testpublic void test(){try {Class userClass = Class.forName("reflect.User");// 获取所用声明方法Method[] ms = userClass.getDeclaredMethods();for(Method m : ms) {// 获取方法名字System.out.print("方法名:"+ m.getName());// 获取返回值类型System.out.print(",返回值类型:"+m.getReturnType().getName());// 获取参数类型Class[] cs = m.getParameterTypes();for(Class c : cs) {System.out.print(",参数类型:"+c.getSimpleName());}System.out.println();}} catch (Exception e) {e.printStackTrace();}}

结果:
方法名:say,返回值类型:void,参数类型:String,参数类型:int
方法名:say,返回值类型:void
方法名:desc,返回值类型:void

通过User类对象,获取成员变量信息

    @Testpublic void test(){try {Class userClass = Class.forName("reflect.User");Field[] field = userClass.getDeclaredFields();for(Field f : field) {System.out.println("成员名字:"+f.getName()+",成员类型:"+f.getType().getSimpleName());}} catch (Exception e) {e.printStackTrace();}}

结果:
成员名字:name,成员类型:String
成员名字:age,成员类型:Integer

通过User类对象,获取构造函数信息

    @Testpublic void test(){try {Class userClass = Class.forName("reflect.User");Constructor[] con = userClass.getDeclaredConstructors();for(Constructor c : con) {// 构造方法名字System.out.print(c.getName()+"(");Parameter[] para = c.getParameters();// 获取构造方法参数类型for(Parameter cc : para) {System.out.print(cc.getType()+" ");}System.out.println(")");}} catch (Exception e) {e.printStackTrace();}}

结果:
reflect.User()
reflect.User(class java.lang.String class java.lang.Integer )

利用反射调用类的方法

    @Testpublic void getMethod(){User user = null;try {user = (User)Class.forName("reflect.User").newInstance();Method method = user.getClass().getMethod("say", String.class, int.class);// 通过Method对象,调用对象中的方法。method.invoke(user, "费强胜", 24);} catch (Exception e) {e.printStackTrace();} }

结果:重载say方法:我叫费强胜,24岁了!

转载于:https://www.cnblogs.com/feiqiangsheng/p/11075612.html

Java8基础之反射相关推荐

  1. Java、Android基础之—反射

    前言 写这篇文章原因之一,是因为之后会对一些Android第三方框架进行分析.虽不能达到完全清晰,但大体的涉及知识需明白. 反射概述 反射是框架设计的灵魂.(使用的前提条件:必须先得到代表的字节码的C ...

  2. java 反射泛型方法_java基础之反射和泛型以及注解

    java基础之反射和泛型以及注解 泛型擦除 泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息. 声明泛型集合,集合两端类型必须一致.类型也可以用包装类型,泛型的类型必须是引用类型, ...

  3. 反射 字段_java核心基础之反射

    前言 大家好,我是 jack xu,今天跟大家介绍核心基础里面的反射,反射这个东西你说它重要也重要,不重要也不重要.重要是当你看一些框架的源码时候,里面会用到反射的代码,你不会是看不懂的.不重要是因为 ...

  4. 反射的基础应用——反射+注解模拟测试框架(Junit)

    反射基础 1.反射定义 所谓反射,其实相当于类照镜子,是一种自省机制:可以使得程序在运行期间动态获取一个类中的成分:在类加载时,任何一个Java类都存在一个java.lang.Class的对象:反射即 ...

  5. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  6. 一篇文章弄懂Java反射基础和反射的应用场景

    文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...

  7. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  8. java基础之 反射_Java基础之反射原理与用法详解

    本文实例讲述了Java基础之反射原理与用法.分享给大家供大家参考,具体如下: 1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx& ...

  9. J2SE基础_JAVA反射基础解析

    很多优秀的开源框架基本原理就是反射,我认为自己不能不重视它 2020.04.18 一.简单了解Java.lang.reflect包 反射机制的相关类 Class类:代表类的实体,在运行的Java应用程 ...

最新文章

  1. 【AAAI2022】基于特征纯化的视线估计算法
  2. SQL Cursor(游标)
  3. Linux JQ 命令学习笔记
  4. mysql odbc 配置详解
  5. 生日快乐编程代码_世界上最好的编程语言,刚刚度过了25周岁生日
  6. mysql+br_mysql有哪几种索引
  7. java调用gbase存储过程,GBase 8T数据库存储过程使用出参示例
  8. omitting directory `folder/'
  9. 浙江省计算机二级aoa成绩,浙江省计算机二级AOAEXCEL函数列表
  10. 通过网络连接检测计算机病毒,网络安全习题及答案
  11. 搭建svn,创建svn项目
  12. No plugin found for prefix ‘doclint‘ in the current project
  13. 【寒江雪】LookRotation详解
  14. 使用python绘制热力图(调用百度地图API)
  15. Ubuntu的一些高(sao)效(cao)率(zuo)工具
  16. 软件工程导论06-面向数据结构的分析与设计
  17. Oracle10g 基本命令
  18. 垃圾网线,毁我青春(ubuntu安装失败)
  19. 你真的会使用“布尔类型(Boolean)”么?
  20. 为micropython添加模块(2)-类模块

热门文章

  1. C/C++日志写入系统log(/var/log/syslog)
  2. paros web中间件攻击、扫描、监控
  3. OWASP-ZAP扫描器的使用(攻击)
  4. Redis 与 zset(sorted set有序集合) 相关的常用命令
  5. 非常详细Redis数据库入门教程
  6. Chromium CEF 2623 -- 支持 xp 的最后一个版本源码下载和编译步骤
  7. selenium自动化测试——常见的八种元素定位方法
  8. Asp.net C# 遍历Excel中的表格名称
  9. HDU 1867 KMP
  10. DataList嵌套