首页 > 其他分享 >框架设计之魂——反射

框架设计之魂——反射

时间:2022-08-17 22:24:43浏览次数:75  
标签:之魂 框架 反射 Auto printStackTrace generated catch TODO Class

 

/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*vx:it_daimeng
*/

  

反射是框架设计的灵魂

一、什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

 

二、反射的原理

反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述

​编辑

 

 

三、反射机制主要提供以下功能:

①在运行时判断任意一个对象所属的类;

②在运行时构造任意一个类的对象;

③在运行时判断任意一个类所具有的成员变量和方法;

④在运行时调用任意一个对象的方法;

⑤生成动态代理。

 

 

四、Class类

 

1.获取Class对象的三种方式

1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。

   2、Class clazz2  = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。

  3、Class clazz3 = p.getClass();    //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 

 

通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");

通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();

 

2、获取类中的构造方法:

 

​编辑

​编辑

 

3、获取类中的属性:

 

​编辑

​编辑

 

4、获取类中的方法:

 

​编辑

​编辑

 

 

 

 

 

五、反射的使用

注意:在运行期间,一个类,只有一个Class对象产生。

1.通过反射获取构造方法并使用

 

​编辑

 

 

2 .通过反射获取不同的构造方法。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                  // TODO Auto-generated method stub

                  //response.getWriter().append("Served at: ").append(request.getContextPath());

        

                  //反射用法1

                  try {

                           Class clazz1=Class.forName("com.test.pojo.Student");

                          

                           //根据参数列表获得指定的构造函数

                           Constructor constructor= clazz1.getDeclaredConstructor(String.class,int.class);

                          

                           //根据构造函数创建对象

                           Student student=(Student) constructor.newInstance("zhangsan",23);

                          

                           response.getWriter().println(student.getSname());

                          

                           //获得所有的构造函数

                           Constructor[] arr= clazz1.getDeclaredConstructors();

                          

                           for(Constructor constructor2 : arr)

                           {

                                    //获得构造函数的参数类型

                                    Class[] brr=  constructor2.getParameterTypes();

                                   

                                    for(Class clazz2:brr)

                                              response.getWriter().print(clazz2.getName()+",");

                                   

                                    response.getWriter().println();

                           }

                          

                          

                  } catch (ClassNotFoundException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (NoSuchMethodException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (SecurityException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (InstantiationException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (IllegalAccessException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (IllegalArgumentException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  } catch (InvocationTargetException e) {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                  }

                 

                 

        

         }

  

 

 

 

  1. 根据反射获取类中所有的字段

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              // TODO Auto-generated method stub

      

              //response.getWriter().append("Served at: ").append(request.getContextPath());

      

              try {

                     Class clazz=Class.forName("com.test.pojo.Student");

                     //获得student类中所有定义的属性(每个属性组装成了一个对象)

                     Field[] arr=clazz.getDeclaredFields();

                    

                     for(Field field: arr)

                     {

                     response.getWriter().println(Modifier.toString(field.getModifiers())+","+field.getName()+","+field.getType());

                           

                     }

                    

                     //根据名称找到指定的字段

                     Field field=clazz.getDeclaredField("sid");

             

                  Student student=(Student) clazz.newInstance();

                 

                  field.setAccessible(true);

                 

                  field.set(student, 1);    

                

                 

                  response.getWriter().println(student.getSid());

                    

                    

                    

                    

              } catch (ClassNotFoundException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (NoSuchFieldException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (SecurityException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (InstantiationException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalAccessException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

      

       }

  

 

4、通过反射获取方法

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              // TODO Auto-generated method stub

              //response.getWriter().append("Served at: ").append(request.getContextPath());

      

              Class clazz=Student.class;

             

              Student student=new Student();

             

              try {

             

                     //通过反射 获得指定的方法

                     Method method= clazz.getDeclaredMethod("test", String.class,int.class);

                  //调用改方法

                     method.invoke(student, "zhangsan",23);

                    

                     Method method2=clazz.getDeclaredMethod("test", int.class);

                    

                     Object o=method2.invoke(student, 25);

                    

                     System.out.println(o.toString());

                    

                    

                    

             

              } catch (NoSuchMethodException | SecurityException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalAccessException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalArgumentException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (InvocationTargetException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

      

             

       }

​

  

标签:之魂,框架,反射,Auto,printStackTrace,generated,catch,TODO,Class
From: https://www.cnblogs.com/daimenglaoshi/p/16596968.html

相关文章

  • linux性能工具--ftrace框架
    对于ftrace架构,主要来了解下内核是如何实现的,其主要包括如下内容:ringbuffer的原理和代码分析tracer(function、function_graph、irq_off)原理和代码分析traceevent......
  • 五,手写SpringMVC框架,过滤器的使用
    8.过滤器8.1编写字符过滤器CharacterEncodingFilter复制项目mymvc4,新建项目mymvc5package com.hy.filter; import java.io.IOException; import javax.......
  • 框架-配置
    全局配置-上小程序配置文件app.json文件用来对微信小程序进行全局配置,它决定了页面文件的路径、窗口表现、设置网络超时时间、设置多tab等配置。app.json配置项列表:......
  • 四,手写SpringMVC框架,业务层-什么是耦合/依赖?如何解決
    4.业务层4.1MVC模型MVC:Model(模型),View(视图),Controller(控制器)视图层:用于做数据的展示以及和用户交互的一个界面=>jsp控制层:能够接受客户端的请求并且进行请求转发,具体的......
  • 使用反射对实体类赋值
    JSON字符串{"data":{ "PD01":{ "KEY1":"1", "KEY2":"2", "KEY3":"3" }, "PD02":{ "KEY4":"4", "KEY5":"5&qu......
  • Think PHP框架基础安装6.0
    第一步:点击基础安装tp框架composercreate-projecttopthink/thinktp第二步:点击架构多应用模式拓展composerrequiretopthink/think-multi-app第三步:点击命令行自......
  • 搭建UnityGameFramework框架最低需求项目
    1、下载GameFramework包进入官网的下载页面下载2021.05.31版本https://gameframework.cn/download/2、新建Unity项目,然后把包导入3、新建Editor文件夹,并创建GameFr......
  • Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局
    系列目录:本系列分为项目集成、项目部署、架构演进三个方向,后续会根据情况调整文章目录。本系列第一篇:Taurus.MVCV3.0.3微服务开源框架发布:让.NET架构在大并发的演进......
  • Unity3d反射(Reflection)
    无论是VR、AR,还是游戏开发,都绕不开反射材质,一些童鞋说用反射探测器(ReflectionProbe)制作反射,总感觉地板的反射不正确,本文小姐姐就这一话题,和大家一起探讨一下反射材质的制......
  • Pytest框架 — 09、Pytest的conftest.py文件
    目录1、conftest.py介绍2、conftest.py的特点3、conftest.py文件的使用4、conftest.py的作用域1、conftest.py介绍conftest.py是pytest框架的一种固定写法,把fixture或者......