Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 253|回复: 0

[Java反射学习]Java反射学习的简单应用

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:56:33 | 显示全部楼层 |阅读模式
    这个应用的目的是,传入类名,传入方法名,传入调用的参数即可以调用制定类下的制定方法。 这个应用的好处是,类名和方法名从配置文件中读入,可以改变。类似于一个小型的类加载,然后实例化,然后调用。所以,这个例子对理解JDK加载类也有点点好处。 这个应用中包含三个类。 Calculator:这个类是对计算器的简单建模。用来作测试的。 MethodInvoker:这个类有两个方法,是核心。weakInvoke和Invoke。关于这两个方法的解释在代码注释中。 InvokerTest:测试驱动。 Calculator.java
    1. [/code]
    2. public class Calculator {  
    3.       
    4.     public int add(int a,int b){  
    5.         return a+b;  
    6.     }  
    7.       
    8.     public int sub(int a,int b){  
    9.         return a-b;  
    10.     }  
    11.       
    12.     public int multify(int a,int b){  
    13.         return a*b;  
    14.     }  
    15.       
    16.     public int div(int a,int b){  
    17.         if(b!=0)  
    18.             return a/b;  
    19.         return 0;  
    20.     }  
    21.       
    22.     public int add(int a,int b,int c)  
    23.     {  
    24.         return a+b+c;  
    25.     }  
    26. }
    27.   MethodInvoker.java [code]
    复制代码

    public class MethodInvoker {  
          
         /**  
          * 传入类名即可调用,但是不支持含有简单类型的方法,因为简单类型回自动打包  
          * @param className 要调用的类  
          * @param methodName 要调用的方法  
          * @param params 调用的参数
      * @return  调用后的结果
          */
         public static Object weakInvoke(String className,String methodName,Object[] obj)  
         {  
               
             try {  
                 Class c = Class.forName(className);  
                 Class[] paraClasses=new Class[obj.length];  
                 for(int i=0;i<obj.length;i++)  
                 {  
                     paraClasses=obj.getClass();  
                 }  
                 try {  
                     Method m=c.getMethod(methodName, paraClasses);  
                     Object instance=c.newInstance();  
                     return m.invoke(instance, obj);  
                 } catch (SecurityException e) {  
                     e.printStackTrace();  
                 } catch (NoSuchMethodException e) {  
                     e.printStackTrace();  
                 } catch (IllegalArgumentException e) {  
                     e.printStackTrace();  
                 } catch (IllegalAccessException e) {  
                     e.printStackTrace();  
                 } catch (InvocationTargetException e) {  
                     e.printStackTrace();  
                 } catch (InstantiationException e) {  
                     e.printStackTrace();  
                 }  
             } catch (ClassNotFoundException e1) {  
                 e1.printStackTrace();  
             }  
             return null;  
         }  
         /**  
          * 动态方法调用  
          * @param className 要调用的类  
          * @param methodName 要调用的方法  
          * @param params 调用的参数  
          * @return  调用后的结果  
          */
         public static Object invoke(String className,String methodName,Object[] params)  
         {  
                 Object returnObj=null;  
                     try {  
                         Class c= Class.forName(className);  
                         Method[] ms=c.getMethods();  
                         Object obj=c.newInstance();  
                         for(int i=0;i<ms.length;i++)  
                         {  
                             Method m=ms;  
                             if(m.getName().endsWith(methodName))  
                             {  
                                 try {  
                                     returnObj=m.invoke(obj, params);  
                                 } catch (IllegalArgumentException e) {//参数错误  
                                     returnObj=null;  
                                     continue;  
                                 } catch (InvocationTargetException e) {  
                                     e.printStackTrace();  
                                     break;  
                                 }  
                                 break;  
                             }  
                         }  
                     } catch (ClassNotFoundException e) {  
                         e.printStackTrace();  
                     } catch (InstantiationException e) {  
                         e.printStackTrace();  
                     } catch (IllegalAccessException e) {  
                         e.printStackTrace();  
                     }  
              return returnObj;  
                      
         }  
    }  
    package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class PropertyReader { private Properties prop; private String path; public PropertyReader(String path) { this.prop=new Properties(); this.path=path; try { FileInputStream in=new FileInputStream(new File(this.path)); this.prop.load(in); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String getProperty(String key) { return prop.getProperty(key); } public void addProperty(String key,String value) { prop.put(key, value); } }  InvokerTest.java
    1. [/code]
    2. public class InvokerTest {  
    3.    public static void main(String[] args) {  
    4.       
    5.        try {  
    6.          PropertyReader reader=new PropertyReader("invoke.properties");  
    7.          String name=reader.getProperty("class");  
    8.          String method=reader.getProperty("method");  
    9.          Object[] params=new Object[]{1,2};  
    10.          System.out.println(MethodInvoker.invoke(name, method,params));  
    11.      } catch (SecurityException e) {  
    12.          e.printStackTrace();  
    13.      } catch (IllegalArgumentException e) {  
    14.          e.printStackTrace();  
    15.    }  
    16.    }  
    17. }  
    18.   invoke.properties直接放在工程根路径下,invoke.properties中的内容。 [code]
    复制代码

    class=neu.swc.tzy.methods.Calculator  
    method=add
      执行结果:3. 如果把InvokeTest中的Object[] params=new Object[]{1,2};改为Object[] params=new Object[]{1,2,3};则可以正确地返回结果6.也就是说,该应用支持重载的方法调用。 如果把配置文件中的method改为sub即可以变为减法。 本文出自 “青禾” 博客,请务必保留此出处http://snowteng17.blog.51cto.com/1532294/330470

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/28/235632843.zip
    回复

    使用道具 举报

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

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 02:08 , Processed in 0.291372 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表