反射相关方法

运行时动态访问对象属性的方法

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类中的重要操作

  1. 获得当前类的所有属性:Field[] fields=clazz.getDeclaredFields();然后可以循环遍历出所有属性filed
  2. 设置可以访问属性:filed.setAccessible(true);
  3. 取得属性名称:filed.getName();
  4. 获得属性类型名称: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();
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值