框架设计之魂——反射

打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3027

​ 
  1. /*
  2. *作者:呆萌老师
  3. *☑csdn认证讲师
  4. *☑51cto高级讲师
  5. *☑腾讯课堂认证讲师
  6. *☑网易云课堂认证讲师
  7. *☑华为开发者学堂认证讲师
  8. *☑爱奇艺千人名师计划成员
  9. *在这里给大家分享技术、知识和生活
  10. *各种干货,记得关注哦!
  11. *vx:it_daimeng
  12. */
复制代码
  
反射是框架设计的灵魂

<strong>​编辑</p> 
 
三、反射机制主要提供以下功能:

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

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

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

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

⑤生成动态代理。
 
 
四、Class类

 
1.获取Class对象的三种方式
<a name="t5" rel="noopener">1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。
   2、Class clazz2  = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。
  3、Class clazz3 = p.getClass();    //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 
 
通过类名获取Class对象,Class c = Class.forName("类的完全路径");
通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();
 
2、获取类中的构造方法:
 
​编辑
​编辑
 
3、获取类中的属性:
 
​编辑
​编辑
 
4、获取类中的方法:
 
​编辑
​编辑
 
 
 
 
 
<strong>​编辑</p> 
 
2 .通过反射获取不同的构造方法。
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.                   // TODO Auto-generated method stub
  3.                   //response.getWriter().append("Served at: ").append(request.getContextPath());
  4.         
  5.                   //反射用法1
  6.                   try {
  7.                            Class clazz1=Class.forName("com.test.pojo.Student");
  8.                           
  9.                            //根据参数列表获得指定的构造函数
  10.                            Constructor constructor= clazz1.getDeclaredConstructor(String.class,int.class);
  11.                           
  12.                            //根据构造函数创建对象
  13.                            Student student=(Student) constructor.newInstance("zhangsan",23);
  14.                           
  15.                            response.getWriter().println(student.getSname());
  16.                           
  17.                            //获得所有的构造函数
  18.                            Constructor[] arr= clazz1.getDeclaredConstructors();
  19.                           
  20.                            for(Constructor constructor2 : arr)
  21.                            {
  22.                                     //获得构造函数的参数类型
  23.                                     Class[] brr=  constructor2.getParameterTypes();
  24.                                    
  25.                                     for(Class clazz2:brr)
  26.                                               response.getWriter().print(clazz2.getName()+",");
  27.                                    
  28.                                     response.getWriter().println();
  29.                            }
  30.                           
  31.                           
  32.                   } catch (ClassNotFoundException e) {
  33.                            // TODO Auto-generated catch block
  34.                            e.printStackTrace();
  35.                   } catch (NoSuchMethodException e) {
  36.                            // TODO Auto-generated catch block
  37.                            e.printStackTrace();
  38.                   } catch (SecurityException e) {
  39.                            // TODO Auto-generated catch block
  40.                            e.printStackTrace();
  41.                   } catch (InstantiationException e) {
  42.                            // TODO Auto-generated catch block
  43.                            e.printStackTrace();
  44.                   } catch (IllegalAccessException e) {
  45.                            // TODO Auto-generated catch block
  46.                            e.printStackTrace();
  47.                   } catch (IllegalArgumentException e) {
  48.                            // TODO Auto-generated catch block
  49.                            e.printStackTrace();
  50.                   } catch (InvocationTargetException e) {
  51.                            // TODO Auto-generated catch block
  52.                            e.printStackTrace();
  53.                   }
  54.                  
  55.                  
  56.         
  57.          }
复制代码
  
 
 
 

  • <a name="t11" rel="noopener">根据反射获取类中所有的字段
 
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.               // TODO Auto-generated method stub
  3.       
  4.               //response.getWriter().append("Served at: ").append(request.getContextPath());
  5.       
  6.               try {
  7.                      Class clazz=Class.forName("com.test.pojo.Student");
  8.                      //获得student类中所有定义的属性(每个属性组装成了一个对象)
  9.                      Field[] arr=clazz.getDeclaredFields();
  10.                     
  11.                      for(Field field: arr)
  12.                      {
  13.                      response.getWriter().println(Modifier.toString(field.getModifiers())+","+field.getName()+","+field.getType());
  14.                            
  15.                      }
  16.                     
  17.                      //根据名称找到指定的字段
  18.                      Field field=clazz.getDeclaredField("sid");
  19.             
  20.                   Student student=(Student) clazz.newInstance();
  21.                  
  22.                   field.setAccessible(true);
  23.                  
  24.                   field.set(student, 1);   
  25.                
  26.                  
  27.                   response.getWriter().println(student.getSid());
  28.                     
  29.                     
  30.                     
  31.                     
  32.               } catch (ClassNotFoundException e) {
  33.                      // TODO Auto-generated catch block
  34.                      e.printStackTrace();
  35.               } catch (NoSuchFieldException e) {
  36.                      // TODO Auto-generated catch block
  37.                      e.printStackTrace();
  38.               } catch (SecurityException e) {
  39.                      // TODO Auto-generated catch block
  40.                      e.printStackTrace();
  41.               } catch (InstantiationException e) {
  42.                      // TODO Auto-generated catch block
  43.                      e.printStackTrace();
  44.               } catch (IllegalAccessException e) {
  45.                      // TODO Auto-generated catch block
  46.                      e.printStackTrace();
  47.               }
  48.       
  49.        }
复制代码
  
 
4、通过反射获取方法
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.               // TODO Auto-generated method stub
  3.               //response.getWriter().append("Served at: ").append(request.getContextPath());
  4.       
  5.               Class clazz=Student.class;
  6.             
  7.               Student student=new Student();
  8.             
  9.               try {
  10.             
  11.                      //通过反射 获得指定的方法
  12.                      Method method= clazz.getDeclaredMethod("test", String.class,int.class);
  13.                   //调用改方法
  14.                      method.invoke(student, "zhangsan",23);
  15.                     
  16.                      Method method2=clazz.getDeclaredMethod("test", int.class);
  17.                     
  18.                      Object o=method2.invoke(student, 25);
  19.                     
  20.                      System.out.println(o.toString());
  21.                     
  22.                     
  23.                     
  24.             
  25.               } catch (NoSuchMethodException | SecurityException e) {
  26.                      // TODO Auto-generated catch block
  27.                      e.printStackTrace();
  28.               } catch (IllegalAccessException e) {
  29.                      // TODO Auto-generated catch block
  30.                      e.printStackTrace();
  31.               } catch (IllegalArgumentException e) {
  32.                      // TODO Auto-generated catch block
  33.                      e.printStackTrace();
  34.               } catch (InvocationTargetException e) {
  35.                      // TODO Auto-generated catch block
  36.                      e.printStackTrace();
  37.               }
  38.       
  39.             
  40.        }
复制代码
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表