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();  // ?任意类型     Foo.class赋值给clazz也可以

Method m1 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 [
 name=" + name + ", 
 type=" + type + ", 
 camp=" + camp + "
]";
    }
     
}
原文地址:https://www.cnblogs.com/cs-lcy/p/7296606.html