对反射用法的初探

以前看到别人的一小段方法,使用反射来写的,对反射不是很熟悉,愣是没看懂,今天有幸再次翻出来看了一下,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 }

 

posted @ 2017-03-10 16:11  江湖一笑  阅读(208)  评论(0编辑  收藏  举报