how2j.cn


工具版本兼容问题
与传统的通过new 来获取对象的方式不同
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象


步骤 1 : 创建一个对象   
步骤 2 : 练习-通过配置文件获取对象   
步骤 3 : 答案-通过配置文件获取对象   

步骤 1 :

创建一个对象

edit
通过反射机制创建一个对象
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(); } } }
步骤 2 :

练习-通过配置文件获取对象

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
首先准备一个文本文件: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("进行物理攻击");
    }
 
}
步骤 3 :

答案-通过配置文件获取对象

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活

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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2022-01-17 练习 - 通过配置文件获取对象
莫諾




首先准备一个文本文件:hero.config。 在这个文件中保存类的全名称,可以是charactor.APHero 或者是charactor.ADHero 接着设计一个方法叫做: public static Hero getHero() 在这个方法中,读取hero.config的数据,取出其中的类名,根据类名实例化出对象,然后返回对象。
File f = new File(".../hero.config");
		
		for (Hero h0 : getHeros(f))
			System.out.println(h0.name + ":" + h0.hp);

public static Hero[] getHeros(File 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("charactor.ADHero")) 

{
					adh = (ADHero) cs[i].newInstance();
					adh.physicAttack();
					h[i] = adh;
				}
				if (pClassName[i].equalsIgnoreCase("charactor.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){*}

							


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 通过配置文件获取对象
logiczqr




练习
public static void getObject2() {
		File file = new File("C:\\Users\\Administrator\\Desktop\\hero.config");
		try (FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr)){
			String str = br.readLine();
			Class<?> name = Class.forName(str);
			Constructor<?> constructor = name.getConstructor();
			ADHero hero = (ADHero) constructor.newInstance();
			hero.physicAttack();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2021-06-13 练习答案
2021-04-20 小朋友有很多问号。。。。。。
2021-02-08 hero.config其中的类名是什么意思


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 21 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 高级-反射机制-创建对象 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图