java.lang包里的类和新建的实体类有什么区别
时间: 2024-01-02 21:03:35 浏览: 69
`java.lang`包是Java语言提供的核心包之一,其中定义了Java语言的基本类和接口。这些类和接口通常被认为是Java语言的“内置类型”,可以直接在代码中使用,无需导入。
新建的实体类则是根据业务需求自定义的Java类,用于表示数据库中的一张表或多张表之间的关联关系。这些实体类通常包含一些属性(成员变量)和方法,用于描述表中的各个字段以及与其他表之间的关联关系。
两者的区别在于,`java.lang`包中的类是Java语言提供的基础类型,包括基本数据类型(如int、double等)和一些常用的引用类型(如String、Object等)。而新建的实体类是根据业务需求自定义的类型,用于表示特定的业务实体。
在Java程序中,我们通常会使用`java.lang`包中的类,如String、Integer等。而实体类则是根据具体的业务需求定义的,通常需要我们自己来编写和维护。
相关问题
反射修改实体类的字段名
### 使用反射动态修改Java实体类字段名称
需要注意的是,在Java中,一旦编译完成,无法直接通过反射机制更改已定义的字段名称。这是因为字节码文件中的字段名是在编译期确定下来的,而反射主要用于操作运行时环境下的对象结构及其行为。
不过可以间接达到类似效果的一种方式是创建一个新的带有期望字段名称的新类实例,并将旧实例的数据复制过去。下面展示了一个基于此思路的例子:
```java
import java.lang.reflect.Field;
import java.util.HashMap;
public class FieldRenamer {
public static Object renameField(Object originalObject, String oldFieldName, String newFieldName) throws Exception{
Class<?> clazz = originalObject.getClass();
// 获取原字段并设置可访问
Field oldField = clazz.getDeclaredField(oldFieldName);
oldField.setAccessible(true);
// 创建目标类的一个新实例用于保存数据
Object targetInstance = clazz.getConstructor().newInstance();
HashMap<String,Object> fieldValues = new HashMap<>();
// 遍历所有字段读取值到map里
for (Field f : clazz.getDeclaredFields()){
f.setAccessible(true);
fieldValues.put(f.getName(),f.get(originalObject));
}
// 移除老名字对应的键值对
Object valueToTransfer = fieldValues.remove(oldFieldName);
// 如果存在该字段则将其加入新的映射关系下
if(valueToTransfer != null){
fieldValues.put(newFieldName,valueToTransfer);
}
// 将更新后的field-values写入target instance
for(String key:fieldValues.keySet()){
try{
Field tempF=clazz.getDeclaredField(key);
tempF.setAccessible(true);
tempF.set(targetInstance,fieldValues.get(key));
}catch(NoSuchFieldException e){
continue; // 跳过不存在于当前class里的fields
}
}
return targetInstance;
}
}
```
上述代码实现了`renameField()`函数,它接受三个参数:原始对象、要重命名的老字段以及想要赋予的新字段名称。这段逻辑会先遍历给定的对象的所有字段并将它们的名字和对应值存储在一个哈希表中;接着移除指定的老字段条目并向其中添加具有相同值但不同key(即新字段名)的一组记录;最后再把这些经过调整过的键值对重新赋回至新建的目标实例上[^1]。
然而值得注意的是这种方法并没有真正改变原有类定义内的任何东西——仅仅是构建出了另一个拥有预期布局的新对象而已。如果希望更深入地控制或改造类本身,则可能涉及到诸如ASM这样的字节码操控库的应用领域之外去了。
使用freemarker,根据表自动生成实体类、指令、Controller、Service、Dao、html
您可以使用FreeMarker作为模板引擎,通过编写模板来自动生成所需的实体类、指令、Controller、Service、Dao和HTML等文件。以下是一些示例模板以供参考:
实体类模板:
```java
package ${basePackage}.entity;
import lombok.Data;
@Data
public class ${className} {
<#list properties as prop>
/**
* ${prop.comment}
*/
private ${prop.type} ${prop.name};
</#list>
}
```
指令模板:
```java
package ${basePackage}.command;
import lombok.Data;
@Data
public class ${className}Command {
<#list properties as prop>
/**
* ${prop.comment}
*/
private ${prop.type} ${prop.name};
</#list>
}
```
Controller模板:
```java
package ${basePackage}.controller;
import ${basePackage}.command.${className}Command;
import ${basePackage}.entity.${className};
import ${basePackage}.service.${className}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/${classPath}")
public class ${className}Controller {
@Autowired
private ${className}Service ${className?uncap_first}Service;
@PostMapping
public ${className} create(@RequestBody ${className}Command ${className?uncap_first}Command) {
return ${className?uncap_first}Service.create(${className?uncap_first}Command);
}
@GetMapping("/{id}")
public ${className} getById(@PathVariable Long id) {
return ${className?uncap_first}Service.getById(id);
}
@PutMapping("/{id}")
public ${className} updateById(@PathVariable Long id, @RequestBody ${className}Command ${className?uncap_first}Command) {
return ${className?uncap_first}Service.updateById(id, ${className?uncap_first}Command);
}
@DeleteMapping("/{id}")
public void deleteById(@PathVariable Long id) {
${className?uncap_first}Service.deleteById(id);
}
}
```
Service模板:
```java
package ${basePackage}.service;
import ${basePackage}.command.${className}Command;
import ${basePackage}.entity.${className};
import ${basePackage}.dao.${className}Dao;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ${className}Service {
@Autowired
private ${className}Dao ${className?uncap_first}Dao;
public ${className} create(${className}Command ${className?uncap_first}Command) {
${className} ${className?uncap_first} = new ${className}();
BeanUtils.copyProperties(${className?uncap_first}Command, ${className?uncap_first});
return ${className?uncap_first}Dao.save(${className?uncap_first});
}
public ${className} getById(Long id) {
return ${className?uncap_first}Dao.getById(id);
}
public ${className} updateById(Long id, ${className}Command ${className?uncap_first}Command) {
${className} ${className?uncap_first} = ${className?uncap_first}Dao.getById(id);
BeanUtils.copyProperties(${className?uncap_first}Command, ${className?uncap_first});
return ${className?uncap_first}Dao.save(${className?uncap_first});
}
public void deleteById(Long id) {
${className?uncap_first}Dao.deleteById(id);
}
}
```
Dao模板:
```java
package ${basePackage}.dao;
import ${basePackage}.entity.${className};
import org.springframework.data.jpa.repository.JpaRepository;
public interface ${className}Dao extends JpaRepository<${className}, Long> {
}
```
HTML模板:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>${className}列表</title>
</head>
<body>
<h1>${className}列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<#list properties as prop>
<th>${prop.comment}</th>
</#list>
<th>操作</th>
</tr>
</thead>
<tbody>
<#list dataList as data>
<tr>
<td>${data.id}</td>
<#list properties as prop>
<td>${data[prop.name]}</td>
</#list>
<td>
<a href="/${classPath}/${data.id}">详情</a>
<a href="/${classPath}/${data.id}/edit">编辑</a>
<a href="/${classPath}/${data.id}?_method=DELETE">删除</a>
</td>
</tr>
</#list>
</tbody>
</table>
<a href="/${classPath}/new">新建${className}</a>
</body>
</html>
```
以上仅是模板的示例,您可以根据自己的需求进行修改和扩展。使用FreeMarker生成文件的具体步骤如下:
1. 定义模板文件,可以使用FreeMarker的语法编写模板;
2. 定义模板数据,可以是Java对象或者Map等;
3. 使用FreeMarker的Template类加载模板文件,得到Template对象;
4. 创建Writer对象,将渲染后的模板内容输出到文件中。
以下是一个示例代码,用于生成实体类文件:
```java
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class EntityGenerator {
public static void generate(String basePackage, String className, Map<String, Object> properties) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
cfg.setClassLoaderForTemplateLoading(EntityGenerator.class.getClassLoader(), "templates");
cfg.setDefaultEncoding("UTF-8");
Template template = cfg.getTemplate("entity.ftl");
Map<String, Object> data = new HashMap<>();
data.put("basePackage", basePackage);
data.put("className", className);
data.put("properties", properties);
File file = new File(String.format("%s/src/main/java/%s/entity/%s.java", System.getProperty("user.dir"), basePackage.replaceAll("\\.", "/"), className));
FileWriter writer = new FileWriter(file);
template.process(data, writer);
writer.close();
System.out.println(String.format("Entity generated: %s", file.getAbsolutePath()));
}
}
```
使用方式示例:
```java
Map<String, Object> properties = new HashMap<>();
properties.put("id", new Property("Long", "ID"));
properties.put("name", new Property("String", "名称"));
properties.put("age", new Property("Integer", "年龄"));
EntityGenerator.generate("com.example.demo", "User", properties);
```
这段代码将会生成一个名为User.java的实体类文件,包含id、name和age三个属性。
阅读全文
相关推荐
















