Java机制---反射

本文深入解析Java反射机制,探讨其工作原理及应用场景。反射允许程序在运行时动态加载类,适用于服务器环境中按需加载类的需求。文章通过实例演示了如何使用反射调用方法和创建对象。

Java机制---反射

反射使用的前提:该类必须加载到jvm中,并生成对应的class文件(字节码)

只有这样才能通过反射来动态获取加载这个类

  •     首先了解一下jvm(java的虚拟机),Java之所以可以跨平台就是因为它,也可以理解成一个
  • 进程,一个程序,只不过它的主要用途是为了跑你的Java代码来用的。

     jvm的组成是由一个方法区,一个堆,一个栈组成的。

     举个例子,当你写一段代码Persion o=new Persion ();

  •       启动程序,首先jvm会先启动,并把你的代码编译成class文件,然后被类加载器(Class Loader)加载到内存中,你的类Persion就会加载到方法区中,而你创建的对象o就会到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Persion ()。
  •  
  •      反射是什么,就是当我们的程序在运行时,需要动态的加载一些类(可能之前用不到所以不用加载到jvm的类),而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。

练习:

  • /**
  • * Method方法反射
  • * **/

准备:

(1)、

       package com.ljz.api;
       public interface TestUtil {
               public void test(int i);
       }

(2)、

       package com.ljz;
       import com.ljz.api.TestUtil;
       public class test implements TestUtil{
              @Override
              public void test(int i) {
                     // TODO Auto-generated method stub
                     System.out.println("test.test()-----------"+i+"-------------------------");
              }
       }

测试:

       public static void main(String[] args) {
              try {
                     Class c = Class.forName("com.ljz.test");
                     Object obj = c.newInstance();
                     /**
                      * getDeclaredMethod(方法名,参数)
                      *
                      * **/
                     Method method = c.getDeclaredMethod("test",int.class);
                     //通过反射调用Test类中的say方法
                     method.invoke(obj, 13);
                     
              } catch (InstantiationException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } catch (IllegalAccessException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } 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 (IllegalArgumentException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } catch (InvocationTargetException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              }
       }

 

  • /**
  • * 非Method方法反射
  • * **/

准备:

(1)、

       package com.fs.api;
       public interface Baseaction {
              
              public  void executeCheck();
              
       }

(2)、

       package com.fs.model;
       import com.fs.api.Base;
       import com.fs.api.Baseaction;
       public class T_1 implements Baseaction{
                      
              @Override
              public void executeCheck() {
                     // TODO Auto-generated method stub
                     System.out.println("---------------------------T1-------------------------");
                     //添加日志
              }
       }

(3)、

       package com.fs.model;
       import com.fs.api.Base;
       import com.fs.api.Baseaction;
       public class T_2 implements Baseaction{
                      
              @Override
              public void executeCheck() {
                     // TODO Auto-generated method stub
                     System.out.println("---------------------------T2-------------------------");
                     //添加日志
              }
       }

测试:

     public static void main(String[] args) {
       try {  
              Baseaction base = ((Baseaction)Class.forName("com.fs.model.T_1").newInstance());  
              base.executeCheck();
              Thread.sleep(1000);  
              Baseaction base = ((Baseaction)Class.forName("com.fs.model.T_2").newInstance());  
              base.executeCheck();                                    
       } catch (Exception e) {
              // TODO: handle exception
              e.printStackTrace();
       }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗子~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值