zoukankan      html  css  js  c++  java
  • 对反射用法的初探

    以前看到别人的一小段方法,使用反射来写的,对反射不是很熟悉,愣是没看懂,今天有幸再次翻出来看了一下,API的小用法。
    此次弄清除2个问题:
    1、invoke()方法的作用
    2、getMethod(obj,new Class[]{x.class,y.class,...});的用法
    解答: 自我理解
    1、invoke()方法的作用,就是执行对象要调用的方法
    2、getMethod()方法中第二个参数是一个class的数组,用以标识参数类型
    详细测试示例如下:
    Class<?> c = Ref.class;
    Object o = c.newInstance();
    //第一个实参为方法名,第二个实参为方法参数类型对应的class对象
    Method nameMethod = c.getDeclaredMethod("setName",String.class);
    nameMethod.invoke(o,"name1");//运行方法
    nameMethod = c.getDeclaredMethod("getName", null);
    String name = (String) nameMethod.invoke(o, null);
    /**
     * @description 测试用例
     * @version 1.0   
     */
    public class Ref {
    
        private String name;
        
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
        
        public String say(String name,Integer age){
            return "My name id "+name+" and my age is " + age;
        }
        
        public String say(){
            return "My name id "+this.name+" and my age is " + this.age;
        }
        
    }
     1 /**
     2  * @description 反射学习方式
     3  * @version 1.0   
     4  */
     5 public class RefTest {
     6 
     7     public  void putValue(String name,Object value) throws Exception{  
     8            Class c = this.getClass();  
     9            Class v = value.getClass();  
    10            String setMethodName = "set"
    11                    + name.substring(0, 1).toUpperCase()
    12                    + name.substring(1);
    13            Method m = c.getMethod(setMethodName, new Class[]{v});  
    14            m.invoke(this, new Object[]{value});  
    15      } 
    16     
    17     
    18     public static void main(String[] args) throws Exception{
    19         
    20         Class<?> c = Ref.class;
    21         Object o = c.newInstance();
    22         //单参、多参和无参
    23         Method nameMethod = c.getDeclaredMethod("setName",String.class);
    24         nameMethod.invoke(o,"name1");//运行方法
    25         Method ageMethod = c.getDeclaredMethod("setAge", Integer.class);
    26         ageMethod.invoke(o, 18);
    27         Class cs = String.class; Class ci = Integer.class;
    28         Method sayMethod2 = c.getDeclaredMethod("say", new Class[]{cs,ci});
    29         String say2 = (String)sayMethod2.invoke(o, "name2",16);
    30         System.out.println(say2);
    31         
    32     }
    33 
    34 }
  • 相关阅读:
    Windows Server 2012 R2 或 2016 无法安装 .Net 3.5.1
    织梦DeDeCms会员登录或退出跳转到首页的修改方法
    use ngCordova in ionic
    Angular2 Todo App
    use traceur in ES6
    Angular2 Use styles in Component
    Angular2 use ng-xx (ng-if)
    Angular2 Router
    Angular2 Http
    1 TypeScript SetUp for Webstorm
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/6531210.html
Copyright © 2011-2022 走看看