0
点赞
收藏
分享

微信扫一扫

反射技术总结

静守幸福 2022-02-08 阅读 55

反射技术总结

1 反射技术

2 Class对象

类的实例化:
之前:Car c = new Car();
现在:clazz.newInstance(); // 创建对象

public class ClassDemo {
	static class InnerClass{
		
		public InnerClass() {
			System.out.println("我是InnerClass构造方法");
		}
		
		public void print() {
			System.out.println("我是静态内部类");
		}
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Class<InnerClass> clazz = InnerClass.class;// 拿到Class对象
		InnerClass a = clazz.newInstance();// 创建对象
		a.print();
		
	}

}

3 Field类

3.1 例子

public class FiledDemo {

	static class Car {
		private String brand;
		private String color;
		private double price;

		public String getBrand() {
			return brand;
		}

		public void setBrand(String brand) {
			this.brand = brand;
		}

		public String getColor() {
			return color;
		}

		public void setColor(String color) {
			this.color = color;
		}

		public double getPrice() {
			return price;
		}

		public void setPrice(double price) {
			this.price = price;
		}

		@Override
		public String toString() {
			return "Car [brand=" + brand + ", color=" + color + ", price=" + price + "]";
		}

	}

	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
		Car c = new Car();
		c.setBrand("奇瑞QQ");
		c.setColor("蓝色");
		c.setPrice(20000.00);

		System.out.println(c);

		// 通过反射技术可以拿到private修饰的属性
		Class<Car> clazz = Car.class;// 拿到Car的Class对象

		Field[] fields = clazz.getDeclaredFields();// 通过Class对象拿到所有属性

		for (Field field : fields) {
			field.setAccessible(true);// 设置为可访问
			System.out.println("属性名称:" + field.getName());// 属性名称
			System.out.println("属性类型名称:" + field.getType().getName());// 属性类型名称
			System.out.println("属性类型名称简写:" + field.getType().getSimpleName());

			if (field.getType().getSimpleName().equals("double")) {// 修改Car的属性
				field.set(c, 50000.00);
			}
		}

		System.out.println("用反射技术修改后" + c);

	}

}

在这里插入图片描述

4 Method类

public class MethodDemo {

	static class Car {
		private String brand;
		private String color;
		private double price;

		public void run() {
			System.out.println("汽车发动");
		}

		public String getBrand() {
			return brand;
		}

		public void setBrand(String brand) {
			this.brand = brand;
		}

		public String getColor() {
			return color;
		}

		public void setColor(String color) {
			this.color = color;
		}

		public double getPrice() {
			return price;
		}

		public void setPrice(double price) {
			this.price = price;
		}

		@Override
		public String toString() {
			return "Car [brand=" + brand + ", color=" + color + ", price=" + price + "]";
		}

	}

	public static void main(String[] args) throws Exception {
		Car c = new Car();
		c.setBrand("奇瑞QQ");
		c.setColor("蓝色");
		c.setPrice(20000.00);
		System.out.println(c);
		// c.run();// 大部分情况下,是创建对象后调用run()方法

		// 用反射的方法调用run()方法
		Class<Car> clazz = Car.class;// 拿到反射对象
		// Method[] declaredMethods = clazz.getDeclaredMethods();// 拿到所有的方法
		Method method = clazz.getDeclaredMethod("run");// 根据方法名和参数类型拿到对应的方法
		method.invoke(c);// 传入对象和参数值

		Method setmethod = clazz.getDeclaredMethod("setColor", String.class);// 拿到set方法,参数类型是String的class对象
		setmethod.invoke(c, "黑色");
		System.out.println(c);

		Method getMethod = clazz.getDeclaredMethod("getPrice");// 拿到get方法
		Object val = getMethod.invoke(c);
		System.out.println(val);

	}

}

5 反射的应用

用反射技术自动生成sql语句

public class SQLHelper {
	private static volatile SQLHelper instance;
	private final StringBuilder sb = new StringBuilder();

	private SQLHelper() {

	}

	public static SQLHelper getInstance() {
		if (instance == null) {
			synchronized (SQLHelper.class) {
				if (instance == null) {
					instance = new SQLHelper();
				}
			}
		}
		return instance;
	}

	/**
	 * 自动生成sql语句
	 * INSERT INTO 表名(car_brand,car_color,car_price) values(?,?,?)
	 * 
	 * @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("(");

		int count = 0;
		try {
			for (Field field : fields) {
				field.setAccessible(true);
				Object retval = field.get(obj);
				if (retval != null) {// 有值,准备放入数据库
					sb.append(tableName + "_" + field.getName());
					sb.append(",");
					count++;
				}
			}
			sb.deleteCharAt(sb.length() - 1);
			sb.append(") VALUES(");
			
			for(int i = 0 ; i < count ; i ++) {
				sb.append("?,");
			}
			sb.deleteCharAt(sb.length() - 1);
			
			sb.append(")");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return sb.toString();
	}

}

在这里插入图片描述

举报

相关推荐

0 条评论