反射初体验
通用代码
ICource 接口
public interface ICource {
public void record();
}
JavaCourse
public class JavaCourse implements ICource{
@Override
public void record() {
System.out.println("录制Java课程");
}
}
PythonCourse
public class PythonCourse implements ICource{
@Override
public void record() {
System.out.println("录制Python课程");
}
}
背景
要执行一段方法,判断(if会特别浪费代码),为了简化代码,用到了反射
很麻烦
public ICource create(String name) {
if ("java".equals(name)) {
return new JavaCourse();
} else if ("python".equals(name)) {
return new PythonCourse();
} else {
return null;
}
}
解决方法一(未优化)
package com.yu;
public class CourseFactory {
public ICource create(String className) {
try {
if (!(null == className || "".equals(className))) {
return (ICource) Class.forName(className).newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
调用 缺点(要传字符串有局限性)
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
factory.create("com.yu.JavaCourse").record();
factory.create("com.yu.PythonCourse").record();
}
解决方法二(优化解决字符串局限性)
public class CourseFactory {
public ICource create(Class<? extends ICource> clazz) {
try {
if (null !=clazz) {
return clazz.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
factory.create(JavaCourse.class).record();
factory.create(PythonCourse.class).record();
}