使用反射和接口编程还能达到解耦合的作用,
反射制作获取对象是在运行时加载的,而new 对象是在编译阶段加载的
获取类类型有三种方式:
1.类名.class #相当于每个类都有一个隐藏的静态属性 class
2. 对象名.getClass() #相当于每个类都有一个getClass()方法
3. Class.forName("类") #我们写的类也是对象,类是Class类的对象,类类型就是把类表示成Class的对象
class Excel implements OfficeBetter {
public void run() {
System.out.println("Excel..run..");
}
public void say(String s) {
System.out.println("parameters: " + s);
}
}
class Word implements OfficeBetter {
public void run() {
System.out.println("Word run");
}
public void say(String s) {
System.out.println("parameters: " + s);
}
}
interface OfficeBetter {
public void run();
public void say(String s);
}
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
class Office {
public static void main(String[] args) throws Exception {
/**
if("Word".equals(args[0])) {
// 原始的类
//Word w = new Word();
//Class c = Class.forName("Word");
//Word w = (Word)c.newInstance();
// 使用接口
//OfficeBetter w = (OfficeBetter)Class.forName("Word").newInstance();
// w.run();
((OfficeBetter)Class.forName("Word").newInstance()).run();
}
**/
Class c = Class.forName(args[0]);
Method[] dm = c.getDeclaredMethods();
for(Method m : dm) {
// get Method returnType and name
System.out.print(m.getReturnType() + " " + m.getName() + "(");
Class[] parameterTypes = m.getParameterTypes();
for(Class para : parameterTypes) {
System.out.print(para.getSimpleName() + ",");
}
System.out.println(")\n-------------");
}
// get the type of parameters of method
((OfficeBetter)c.newInstance()).run();
}
}
E:\code>java Office Excel
void run()
-------------
void say(String,)
-------------
Excel..run..