上一篇
最近Oracle发布了Java 21的长期支持版本(2025年8月更新),其中反射API性能提升了近40%!这让原本就强大的反射机制如虎添翼,特别是在数据库操作领域,简直是ORM框架的"内功心法",今天咱们就掰开了揉碎了,聊聊这个让新手瑟瑟发抖的"黑魔法"💫
简单说就是程序在运行时能自我解剖——获取类信息、调用方法、操作字段,连private成员都不放过!就像拿到了Java类的"体检报告"📋
// 获取类的三种方式(2025年仍适用) Class<?> clazz1 = Class.forName("com.example.User"); Class<?> clazz2 = User.class; Class<?> clazz3 = new User().getClass();
public static <T> T resultSetToBean(ResultSet rs, Class<T> clazz) { T obj = clazz.newInstance(); ResultSetMetaData meta = rs.getMetaData(); for (int i = 1; i <= meta.getColumnCount(); i++) { String columnName = meta.getColumnLabel(i); Field field = clazz.getDeclaredField(columnName); field.setAccessible(true); // 突破private限制 field.set(obj, rs.getObject(i)); } return obj; }
public static String generateInsertSQL(Object obj) { Class<?> clazz = obj.getClass(); StringBuilder sql = new StringBuilder("INSERT INTO "); // 获取表名(假设有@Table注解) Table tableAnno = clazz.getAnnotation(Table.class); sql.append(tableAnno.value()).append(" ("); // 遍历所有字段 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { Column columnAnno = field.getAnnotation(Column.class); if (columnAnno != null) { sql.append(columnAnno.name()).append(","); } } // 去掉最后逗号... return sql.toString(); }
缓存反射结果:别每次都getDeclaredField()
// 使用ConcurrentHashMap缓存(Java21新特性) private static final Map<Class<?>, Map<String, Field>> FIELD_CACHE = new ConcurrentHashMap<>();
MethodHandle替代反射:Java7+就有的黑科技
MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodHandle setter = lookup.findSetter(User.class, "name", String.class); setter.invokeExact(user, "张三");
启用反射过滤:Java9引入的安全特性
--add-opens java.base/java.lang=ALL-UNNAMED
// 自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface DbField { String value(); boolean isPrimaryKey() default false; } // 使用示例 public class User { @DbField(value = "user_id", isPrimaryKey = true) private Long id; @DbField("user_name") private String name; } // 反射处理器 public class ORMUtil { public static void save(Object entity) throws Exception { Class<?> clazz = entity.getClass(); String tableName = clazz.getSimpleName().toLowerCase(); StringBuilder sql = new StringBuilder("INSERT INTO " + tableName + " ("); StringBuilder values = new StringBuilder(" VALUES ("); for (Field field : clazz.getDeclaredFields()) { DbField dbField = field.getAnnotation(DbField.class); if (dbField != null) { field.setAccessible(true); sql.append(dbField.value()).append(","); values.append("'").append(field.get(entity)).append("',"); } } // 拼接完整SQL... } }
随着Java虚拟线程(Project Loom)的成熟,反射+数据库操作可能会有这些新玩法:
本文由 信红英 于2025-08-05发表在【云服务器提供商】,文中图片由(信红英)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/546747.html
发表评论