步骤 2 : 练习-调用方法 步骤 3 : 答案-调用方法
首先为Hero的name属性,增加setter和getter
通过反射机制调用Hero的setName package charactor;
public class Hero {
public String name;
public float hp;
public int damage;
public int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hero(){
}
public Hero(String string) {
name =string;
}
@Override
public String toString() {
return "Hero [name=" + name + "]";
}
public boolean isDead() {
// TODO Auto-generated method stub
return false;
}
public void attackHero(Hero h2) {
// TODO Auto-generated method stub
}
}
package reflection;
import java.lang.reflect.Method;
import charactor.Hero;
public class TestReflection {
public static void main(String[] args) {
Hero h = new Hero();
try {
// 获取这个名字叫做setName,参数类型是String的方法
Method m = h.getClass().getMethod("setName", String.class);
// 对h对象,调用这个方法
m.invoke(h, "盖伦");
// 使用传统的方式,调用getName方法
System.out.println(h.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
继续上一个练习 练习-通过配置文件获取对象,把hero.config改动成为支持如下格式:
charactor.APHero garen charactor.ADHero teemo 首先根据这个配置文件,使用反射实例化出两个英雄出来。 然后通过反射给这两个英雄设置名称,接着再通过反射,调用第一个英雄的attackHero方法,攻击第二个英雄 package charactor;
public class Hero {
public String name;
public float hp;
public int damage;
public int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hero(){
}
public Hero(String string) {
name =string;
}
@Override
public String toString() {
return "Hero [name=" + name + "]";
}
public boolean isDead() {
// TODO Auto-generated method stub
return false;
}
public void attackHero(Hero h2) {
System.out.println(this.name+ " 正在攻击 " + h2.getName());
}
}
package charactor;
public class APHero extends Hero {
public void magicAttack() {
System.out.println("进行魔法攻击");
}
}
package charactor;
public class ADHero extends Hero {
public void physicAttack() {
System.out.println("进行物理攻击");
}
}
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
package reflection;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import charactor.Hero;
public class TestReflection {
public static void main(String[] args) throws InterruptedException {
File f = new File("E:/project/j2se/hero.config");
try (FileReader fr = new FileReader(f)) {
String fileContent = null;
char[] all = new char[(int) f.length()];
fr.read(all);
fileContent = new String(all);
String[] cs = fileContent.split("\r\n");
String hero1className = cs[0];
String hero1Name = cs[1];
String hero2className = cs[2];
String hero2Name = cs[3];
//根据反射,获取hero1,并且给hero1的name字段赋值
Class hero1Class = Class.forName(hero1className);
Constructor hero1Constructor = hero1Class.getConstructor();
Object hero1 = hero1Constructor.newInstance();
Field hero1NameField = hero1Class.getField("name");
hero1NameField.set(hero1, hero1Name);
//根据反射,获取hero2,并且给hero2的name字段赋值
Class hero2Class = Class.forName(hero2className);
Constructor hero2Constructor = hero2Class.getConstructor();
Object hero2 = hero2Constructor.newInstance();
Field hero2NameField = hero2Class.getField("name");
hero2NameField.set(hero2, hero2Name);
//根据反射,获取attackHero方法,并且调用hero1的这个方法,参数是hero2
Method attackHeroMethod = hero1Class.getMethod("attackHero", Hero.class);
attackHeroMethod.invoke(hero1, hero2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2024-07-22
通过反射,获取并执行对象方法
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2022-01-19
练习 - 调用方法
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-10-27
反射获取各种方法,单参数是如站长代码method.invoke上面是h.attack(h1),那如果方法是attack(Hero h,Hero h1)两个英雄都是参数这样的怎么用什么反射
2020-06-20
练习
2020-05-04
自己写的答案,欢迎大家指正
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 17 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|