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

时间:2023-12-17 15:22:20

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 [\n name=" + name + ", \n type=" + type + ", \n camp=" + camp + "\n]";
} }