目录
这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下来控制程序,也符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)
目的:根据配置文件来指定信息,创建对象,并调用其方法。
这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下来控制程序,也符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)
// 使用反射机制解决
//(1) 加载类, 返回 Class 类型的对象 cls
Class cls = Class.forName(classfullpath);
//(2) 通过 cls 得到你加载的类 com.hspedu.Cat 的对象实例
Object o = cls.newInstance();
System.out.println("o 的运行类型=" + o.getClass()); //运行类型
//(3) 通过 cls 得到你加载的类 com.hspedu.Cat 的 methodName"hi" 的方法对象
// 即:在反射中,可以把方法视为对象(万物皆对象)
Method method1 = cls.getMethod(methodName);
//(4) 通过 method1 调用方法: 即通过方法对象来实现调用方法
System.out.println("=============================");
method1.invoke(o);
//传统方法 对象.方法() , 反射机制 方法.invoke(对象)
Class对象
类的实例化
之前: Car c = new Car( );
现在 : clazz.newInstance() --->创建对象
Filed类:
Car c = new Car();
c.setBrand("蔚蓝");
c.setColor("浅蓝色");
c.setPrice(300000.00);
System.out.println(c);
Class<Car> clazz=Car.class;
Field[] fields = clazz.getDeclaredFields(); //所有属性
for (Field field : fields) {
field.setAccessible(true); //设置属性可以访问
//System.out.println(field.get(c)); //取出属性
System.out.println(field.getName());//属性名称
System.out.println(field.getType().getSimpleName());//属性类型名称
if(field.getType().getSimpleName().equals("double")) {
field.set(c, 99999999.00);
}
}
System.out.println(c);
反射还有Method和Constructor对象,这里就不一一举例了。
反射应用:
package com.dyit.project;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class SQLHelper {
private static volatile SQLHelper instance;
private final StringBuilder sb = new StringBuilder();
private List<Object> list = new ArrayList<>();
private SQLHelper() {
}
public static SQLHelper getInstance() {
if (instance == null) {
synchronized (SQLHelper.class) {
if (instance == null) {
instance = new SQLHelper();
}
}
}
return instance;
}
public List<Object> getValues(){
return list;
}
/**
* 返回动态添加的SQL语句
* @param obj
* @return
*/
public String createInsertSql(Object obj) {
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
sb.append("INSERT INTO ");
String tableName =clazz.getSimpleName().toLowerCase();
sb.append(tableName);
sb.append("(");
try {
for (Field field : fields) {
field.setAccessible(true);
Object retVal = field.get(obj);
if(retVal!=null) {//有值,准备放入数据库
sb.append(tableName+"_"+field.getName());
sb.append(",");
list.add(retVal);
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(") VALUES(");
for(int i=0;i<list.size();i++) {
sb.append("?,");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}
java反射原理图: