步骤 2 : 练习-通过配置文件获取对象 步骤 3 : 答案-通过配置文件获取对象
通过反射机制创建一个对象
package reflection;
import java.lang.reflect.Constructor;
import charactor.Hero;
public class TestReflection {
public static void main(String[] args) {
//传统的使用new的方式创建对象
Hero h1 =new Hero();
h1.name = "teemo";
System.out.println(h1);
try {
//使用反射的方式创建对象
String className = "charactor.Hero";
//类对象
Class pClass=Class.forName(className);
//构造器
Constructor c= pClass.getConstructor();
//通过构造器实例化
Hero h2= (Hero) c.newInstance();
h2.name="gareen";
System.out.println(h2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先准备一个文本文件:hero.config。 在这个文件中保存类的全名称,可以是charactor.APHero 或者是charactor.ADHero
接着设计一个方法叫做: public static Hero getHero() 在这个方法中,读取hero.config的数据,取出其中的类名,根据类名实例化出对象,然后返回对象。 package charactor;
public class APHero extends Hero {
public void magicAttack() {
System.out.println("进行魔法攻击");
}
}
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 charactor; public class ADHero extends Hero { public void physicAttack() { System.out.println("进行物理攻击"); } }
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
Hero h = getHero(); System.out.println(h); 通过打印h,可以发现,当配置文件里的内容发生变化的时候,就会得到不同的对象。 源代码不需要发生任何变化,只需要修改配置文件,就可以导致程序的逻辑发生变化, 这是一种基于配置的编程思想。 Spring框架中的IOC和DI的底层就是基于这样的机制实现的。 package reflection;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import charactor.Hero;
public class TestReflection {
public static void main(String[] args) throws InterruptedException {
Hero h = getHero();
System.out.println(h);
}
public static Hero getHero() {
File f = new File("E:/project/j2se/hero.config");
try (FileReader fr = new FileReader(f)) {
String className = null;
char[] all = new char[(int) f.length()];
fr.read(all);
className = new String(all);
Class clazz=Class.forName(className);
Constructor c= clazz.getConstructor();
Hero h= (Hero) c.newInstance();
return h;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2024-07-22
利用反射,通过类名初始化类
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2022-01-17
练习 - 通过配置文件获取对象
1 个答案
054941LZL_lp 跳转到问题位置 答案时间:2023-05-08 public static void main(String[] args) {
File f = new File("./hero.config");
System.out.println("f: " + f);
// String[] s0 = readTem(f);
// System.out.println(s0);
for (Hero h0 : getHeros(f))
System.out.println(h0.name + ":" + h0.hp);
}
public static Hero[] getHeros(File f) {
System.out.println("f: " + f);
String[] s0 = readTem(f);
String[] pClassName = new String[s0.length];
Class[] pClass = new Class[s0.length];
Constructor[] cs = new Constructor[s0.length];
Hero[] h = new Hero[s0.length];
ADHero adh; APHero aph;
for (int i = 0; i < s0.length; i++) {
pClassName[i] = s0[i];
try {
pClass[i] = Class.forName(pClassName[i]);
// 构造器
cs[i] = pClass[i].getConstructor();
// 通过构造器实例化
if (pClassName[i].equalsIgnoreCase("usefull.ADHero")) {
adh = (ADHero) cs[i].newInstance();
adh.physicAttack();
h[i] = adh;
}
if (pClassName[i].equalsIgnoreCase("usefull.APHero")) {
aph = (APHero) cs[i].newInstance();
aph.magicAttack();
h[i] = aph;
}
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SecurityException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InstantiationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
return h;
}
public static String[] readTem(File f){
// String[] lines = new String[1];
try (FileInputStream fin = new FileInputStream("hero.config")) {
byte[] info = new byte[(int) new File("hero.config").length()];
fin.read(info);
String classPathTmp = new String(info);
String[] classPath = classPathTmp.split("\n");
System.out.println("classPath: " + classPath[0]);
return classPath;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-08-25
通过配置文件获取对象
2021-06-13
练习答案
2021-04-20
小朋友有很多问号。。。。。。
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 22 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|