Java中有一个高级特性:反射,可以根据你传入的类的全限定名,即完整的类名字符串(比如说name),来动态实例化(就是你所说的打开或new出来)你所传入与name同名的类。
Talk is cheap, show me the code, so, 用例子说话:
假设你已经写了3个Jframe窗口类:
1 org.evergreen.demo.Jframe1:
package org.evergreen.demo;
import javax.swing.*;
public class Jframe1 {
private String str;
public Jframe1() {
}
public Jframe1(String s) {
this.str = s;
}
public void sayHello(){
System.out.println("This is Jframe1");
}
}
2 org.evergreen.demo.Jframe2:
package org.evergreen.demo;
public class Jframe2 {
private String str;
public Jframe2() {
}
public Jframe2(String s) {
this.str = s;
}
public void sayHello(){
System.out.println("This is Jframe2");
}
}
3 org.evergreen.demo.Jframe3:
package org.evergreen.demo;
public class Jframe3 {
private String str;
public Jframe3() {
}
public Jframe3(String s) {
this.str = s;
}
public void sayHello(){
System.out.println("This is Jframe3");
}
}
反射核心方法工具类:
package org.evergreen.demo.utils;
public class ClassInitInstanceUtil {
/**
*
* @param fullClassName:注意:这里的fullClassName,必须是包含类所在包名的全限定名,
* 如:org.evergreen.demo.Jframe1,否则无法实例化
* @param args:这里是传入的Jframe类的构造函数的参数
* @return
*/
public static Object initlizeClazz(String fullClassName, Object... args) {
Class[] classes = new Class[args.length];
for (int i = 0; i < classes.length; i++) {
classes[i] = args[i].getClass();
}
Object clazz = null;
try {
clazz = Class.forName(fullClassName).getConstructor(classes).newInstance(args);
} catch (Exception e) {
}
return clazz;
}
}
验证一下,看看效果:
package org.evergreen.demo;
import org.evergreen.demo.utils.ClassInitInstanceUtil;
public class JFrameClazzDemo {
public static void main(String[] args) {
String name1 = "org.evergreen.demo.Jframe1";
String name2 = "org.evergreen.demo.Jframe2";
String name3 = "org.evergreen.demo.Jframe3";
//传入的字符串参数namex,必须是包含类所在包名的全限定名
Jframe1 jframe1 = (Jframe1) ClassInitInstanceUtil.initlizeClazz(name1);
jframe1.sayHello();
Jframe2 jframe2 = (Jframe2) ClassInitInstanceUtil.initlizeClazz(name2);
jframe2.sayHello();
Jframe3 jframe3 = (Jframe3) ClassInitInstanceUtil.initlizeClazz(name3);
jframe3.sayHello();
}
}
执行结果:
看到上面的结果没?这里的反射已经动态的打开,或者说new出来你传入的类名对应的实例了!
刚刚又看了一下你的具体描述,你是个初学者,应该还没有学到java反射这个“黑科技”。
反射功能并不是java独有,很多高级编程语言都内置了这个功能,可以深入学习了解一下。