Java的反射

目录

目的:根据配置文件来指定信息,创建对象,并调用其方法。

这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下来控制程序,也符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)

Class对象

Filed类:

反射应用:

java反射原理图:


目的:根据配置文件来指定信息,创建对象,并调用其方法。

这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下来控制程序,也符合设计模式的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() --->创建对象

创建对象的四种方式 :

1.new    2.克隆      3.序列化     4.反射

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);

反射还有MethodConstructor对象,这里就不一一举例了。

反射应用:

对数据库操作,JdbcUtil(jdbc五部曲),执行SQL语句,SQL自动生成

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反射原理图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值