运行时动态访问对象属性的方法
1.Class对象
类的实例化
之前:Car c = new Car();
现在:Class<?> clazz=Car.class;//获得类
clazz.getInstance();//获得实例化对象
ublic class ClazzDemo {
static class InnerClass{
public void print() {
System.out.println("hi,我是静态内部类");
}
public InnerClass() {
System.out.println("InnerClass 构造方法");
}
}
//调用的是默认无参构造方法
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
//new InnerClass();
Class<InnerClass> clazz =InnerClass.class;//获得当前类
InnerClass a =clazz.newInstance();//获得当前对象
a.print();
}
}
创建对象的四种方式
方式 | 举例 |
---|---|
new关键字 | Car c =new Car(); |
clone(Object的方法) | c.clone(); |
序列化和反序列化(serialable) | ObjectInputStream/ObjectOutputStream |
反射class对象 | clazz.newInstance(); |
2.Filed类
描述类中的属性,(数值)域
public static void main(String[] args) throws Exception {
Car c =new Car();
c.setBrand("BMW");
c.setColor("红色");
c.setPrice(30000.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.getName());//属性名称
System.out.println(field.getType().getSimpleName());//属性类型名称
if(field.getType().getSimpleName().equals("Double")) {
field.set(c, 999999.00);
}
}
System.out.println(c);
}
反射中Filed类中的重要操作
- 获得当前类的所有属性:Field[] fields=clazz.getDeclaredFields();然后可以循环遍历出所有属性filed
- 设置可以访问属性:filed.setAccessible(true);
- 取得属性名称:filed.getName();
- 获得属性类型名称:filed.getTypr().getSimpleName();
3.反射应用
对数据库操作,jdbcUtil(jdbc五部曲),执行sql语句,sql自动生成
/**
* 自动生成添加的sql语句
* @author 86184
*
*/
public class SQLHelper {
private static volatile SQLHelper instance;
private final StringBuilder sb =new StringBuilder();//用来放sql语句
private List<Object> list =new ArrayList<>();//用来放values的值
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;
}
/*
* INSERT INTO 表() VALUES()
*/
public String createInsertSql(Object obj) {
Class<?> clazz = obj.getClass();//获得当前类型的对象
Field[] files = clazz.getDeclaredFields();//获得当前对象的属性
sb.append("INSERT INTO");
String tableName = clazz.getSimpleName().toLowerCase();//获得当前类的名字
sb.append(" "+tableName);
sb.append("(");
try {
//循环获得对象的属性
for (Field field : files) {
field.setAccessible(true);//获得属性的访问权
Object retVal = field.get(obj);//取得当前对象的属性
if(retVal!=null) {//说明有值,准备放入数据库
sb.append(tableName+"_"+field.getName());
sb.append(",");
list.add(retVal);//将属性加入list集合中
}
}
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
}