首页 > 代码库 > java黑魔法-反射机制-02-通过Java反射调用其他类方法

java黑魔法-反射机制-02-通过Java反射调用其他类方法

技术分享

package com.aaron.reflect;

import java.lang.reflect.Method; 
import java.lang.reflect.InvocationTargetException; 

/** 
* Created by IntelliJ IDEA. 
* File: TestRef.java 
* User: leizhimin 
* Date: 2008-1-28 14:48:44 
*/ 
public class TestRef { 
    //直接  foo.outInfo(); 也可以调用那个自定义的方法
    public static void main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { 
        Foo foo = new Foo("这个一个Foo对象!"); //一个类的真正的对象
        Class<?> clazz = foo.getClass();  // ?任意类型= clazz.getDeclaredMethod("outInfo"); //自定义的方法,m1即是方法名
        Method m2 = clazz.getDeclaredMethod("setMsg", String.class);//set方法 
        Method m3 = clazz.getDeclaredMethod("getMsg"); //get方法
        //下面的语句输出--------这是测试Java反射的测试类
        m1.invoke(foo); //不用print就可以打印消息,而且断点foo是一个确实Foo类的对象
        m2.invoke(foo, "重新设置msg信息!"); //不输出
        String msg = (String) m3.invoke(foo); 
        System.out.println(msg); //重新设置msg信息!
    } //方法名.invoke(类的对象);
} 

class Foo { 
    private String msg; 

    public Foo(String msg) { 
        this.msg = msg; 
    } 

    public void setMsg(String msg) { 
        this.msg = msg; 
    } 

    public String getMsg() { 
        return msg; 
    } 

    public void outInfo() { 
        System.out.println("这是测试Java反射的测试类"); 
    } 
}
package com.aaron.reflect;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class Demo5 {
    public static void main(String[] args) {
        Class<?> herosClass = Heros.class; //获得Class类的实例
        //  new herosClass() 不可以new
        try { // 断点里面herosClass的值是class com.aaron.reflect.Heros
            Method m1 = herosClass.getMethod("setName",String.class);
            Method m2 = herosClass.getMethod("getName");
            Method m3 = herosClass.getMethod("say");
           // 或者 Object userInfo = herosClass.newInstance() 
            Heros userInfo =(Heros) herosClass.newInstance();//userInfo值并不是以前那些对象值那样
            m1.invoke(userInfo,"影魔");//调用了set方法了在这里
            System.out.println("调用set方法:"+userInfo);//输出[Heros [name=影魔, type=null,camp=0 ]]                                                                                        
            System.out.println("调用get方法:"+m2.invoke(userInfo));//调用get方法:影魔
            m3.invoke(userInfo); // 可以调用自己的方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


package com.aaron.reflect;
public class Heros {
    private String name;//名字
    private String type;//类型
    private int camp;//
     
    public Heros(){}
 
    public Heros(String name, String type, int camp) {
        super();
        this.name = name;
        this.type = type;
        this.camp = camp;
    }
    public void say(){
        System.out.println("可以调用自己的方法");
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public int getCamp() {
        return camp;
    }
 
    public void setCamp(int camp) {
        this.camp = camp;
    }
 
    @Override
    public String toString() {
        return "Heros [\n name=" + name + ", \n type=" + type + ", \n camp=" + camp + "\n]";
    }
     
}

 

java黑魔法-反射机制-02-通过Java反射调用其他类方法