- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java通过cglib动态生成实体bean的操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1
2
3
4
5
6
7
8
9
10
|
<
dependency
>
<
groupId
>commons-beanutils</
groupId
>
<
artifactId
>commons-beanutils</
artifactId
>
<
version
>1.9.3</
version
>
</
dependency
>
<
dependency
>
<
groupId
>cglib</
groupId
>
<
artifactId
>cglib-nodep</
artifactId
>
<
version
>3.2.4</
version
>
</
dependency
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
package
com.dym.entity;
import
net.sf.cglib.beans.BeanGenerator;
import
org.apache.commons.collections.map.MultiValueMap;
import
java.lang.reflect.*;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;
/**
* @author: zhaoxu
* @description:
*/
public
class
DynamicBeanEntity {
Object dynamicBean;
Class clazz;
public
DynamicBeanEntity(Map dynAttrMap) {
this
.dynamicBean = generateBean(dynAttrMap);
clazz = dynamicBean.getClass();
}
/**
* 获取所有属性值
*
* @return
* @throws IllegalAccessException
*/
public
Map<String, Object> getValues()
throws
IllegalAccessException {
Map<String, Object> fieldValuesMap =
new
HashMap(
16
);
Field[] fields = clazz.getDeclaredFields();
for
(Field field : fields) {
field.setAccessible(
true
);
Object fieldValue = field.get(dynamicBean);
fieldValuesMap.put(field.getName().split(
"\\$cglib_prop_"
)[
1
], fieldValue);
}
return
fieldValuesMap;
}
/**
* 获取动态bean所有方法信息
*
* @return
*/
public
MultiValueMap getMethods() {
MultiValueMap map =
new
MultiValueMap();
Method[] methods = clazz.getMethods();
for
(Method method : methods) {
Type[] genericParameterTypes = method.getGenericParameterTypes();
if
(genericParameterTypes.length >
0
) {
for
(Type type : genericParameterTypes) {
map.put(method.getName(), type);
}
}
else
{
map.put(method.getName(),
null
);
}
}
return
map;
}
/**
* 执行某个方法
*
* @param methodName
* @param parameters
* @return
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws NoSuchMethodException
*/
public
Object executeMethod(String methodName, Object... parameters)
throws
InvocationTargetException, IllegalAccessException, NoSuchMethodException {
ArrayList<Class> paramTypeList =
new
ArrayList();
for
(Object paramType : parameters) {
paramTypeList.add(paramType.getClass());
}
Class[] classArray =
new
Class[paramTypeList.size()];
Method method = clazz.getMethod(methodName, paramTypeList.toArray(classArray));
Object invoke = method.invoke(dynamicBean, parameters);
return
invoke;
}
/**
* 设置属性值
*
* @param property
* @param value
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public
void
setValue(String property, Object value)
throws
NoSuchFieldException, IllegalAccessException {
Field declaredField = clazz.getDeclaredField(
"$cglib_prop_"
+ property);
declaredField.setAccessible(
true
);
declaredField.set(dynamicBean, value);
}
/**
* 获取属性值
*
* @param property
* @return
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public
Object getValue(String property)
throws
NoSuchFieldException, IllegalAccessException {
Field declaredField = clazz.getDeclaredField(
"$cglib_prop_"
+ property);
declaredField.setAccessible(
true
);
Object value = declaredField.get(dynamicBean);
return
value;
}
public
Object getEntity() {
return
this
.dynamicBean;
}
/**
* 利用cglib的BeanGenerator创建对象
*
* @param dynAttrMap
* @return
*/
private
Object generateBean(Map dynAttrMap) {
BeanGenerator generator =
new
BeanGenerator();
Iterator iterator = dynAttrMap.keySet().iterator();
while
(iterator.hasNext()) {
String key = iterator.next().toString();
generator.addProperty(key, (Class) dynAttrMap.get(key));
}
return
generator.create();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package
com.dym.attr;
import
com.dym.entity.DynamicBeanEntity;
import
org.apache.commons.collections.map.MultiValueMap;
import
java.lang.reflect.InvocationTargetException;
import
java.util.HashMap;
import
java.util.Map;
/**
* @author: zhaoxu
* @description:
*/
public
class
test {
public
static
void
main(String[] args)
throws
NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// 设置属性们,默认16
HashMap propertyMap =
new
HashMap(
16
);
propertyMap.put(
"name"
, String.
class
);
propertyMap.put(
"age"
, Integer.
class
);
propertyMap.put(
"height"
, Double.
class
);
// 生成动态 Entity
DynamicBeanEntity bean =
new
DynamicBeanEntity(propertyMap);
//设置属性值
bean.setValue(
"name"
,
"zx"
);
bean.setValue(
"age"
,
22
);
bean.setValue(
"height"
,
175.0
);
//获取属性值
Map<String, Object> values = bean.getValues();
//获取可执行的方法
MultiValueMap methods = bean.getMethods();
//执行某个方法
bean.executeMethod(
"setAge"
,
23
);
System.out.println(
"动态bean的age属性:"
+bean.getValue(
"age"
));
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package
com.dym.test;
import
com.dym.util.DBUtil;
import
com.dym.util.DynmicEntity;
import
org.springframework.stereotype.Component;
import
java.sql.Connection;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Map;
/**
* @author: zhaoxu
* @description:
*/
@Component
public
class
test {
public
static
void
main(String[] args) {
ArrayList<DynmicEntity> beans =
new
ArrayList<>();
Connection conn =
null
;
PreparedStatement prst =
null
;
String sql =
""
;
sql =
"select table_name from information_schema.tables where table_schema=\'public\'"
;
conn = DBUtil.getConn();
try
{
prst = conn.prepareStatement(sql);
ResultSet rs = prst.executeQuery();
while
(rs.next()) {
String tableName = rs.getString(
1
);
Map attrMap =
new
HashMap<>();
String findFieldSql =
"SELECT format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnull \n"
+
"FROM pg_class as c,pg_attribute as a where c.relname = \'"
+ tableName +
"\' and a.attrelid = c.oid and a.attnum>0"
;
PreparedStatement fieldsPrst = conn.prepareStatement(findFieldSql);
ResultSet fieldsRs = fieldsPrst.executeQuery();
while
(fieldsRs.next()) {
String fieldType = fieldsRs.getString(
1
);
String fieldName = fieldsRs.getString(
2
);
attrMap.put(fieldName, Object.
class
);
}
DynmicEntity bean =
new
DynmicEntity(attrMap);
beans.add(bean);
}
}
catch
(SQLException e) {
e.printStackTrace();
}
DBUtil.close(prst, conn);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
package
com.dym.util;
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
/**
* @author: zhaoxu
* @description:
*/
public
class
DBUtil {
private
final
static
String URL=
"jdbc:postgresql://localhost:5432/dynmic"
;
private
final
static
String NAME=
"postgres"
;
private
final
static
String PASS=
"123456"
;
private
static
Connection conn=
null
;
/**
*
*@Title:DBUtil
*@Description:
*/
public
DBUtil(){
}
/**
*
* @Tiltle getConn
* @return Connection
* @Description:返回连接
*/
public
static
Connection getConn(){
//告诉jvm使用mysql
try
{
//加载驱动,string为驱动名字
Class.forName(
"org.postgresql.Driver"
);
//连接数据库,得到Connection连接
conn=DriverManager.getConnection(URL,NAME,PASS);
//System.out.println("连接数据库: "+conn);
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SQLException e){
e.printStackTrace();
}
return
conn;
}
//关闭结果对象集
public
static
void
close(ResultSet rs){
if
(rs!=
null
){
try
{
rs.close();
}
catch
(SQLException e){
e.printStackTrace();
}
}
}
//关闭编译语句对象
public
static
void
close(PreparedStatement prst){
if
(prst!=
null
){
try
{
prst.close();
}
catch
(SQLException e){
e.printStackTrace();
}
}
}
//关闭结果对象集
public
static
void
close(Connection conn){
if
(conn!=
null
){
try
{
conn.close();
}
catch
(SQLException e){
e.printStackTrace();
}
}
}
//对于更新操作关闭资源
public
static
void
close(PreparedStatement prst,Connection conn){
close(prst);
close(conn);
}
//关闭所有
public
static
void
close(ResultSet rs,PreparedStatement prst,Connection conn){
close(rs);
close(prst);
close(conn);
}
}
|
补充:java 反射 json动态转实体类 。
我就废话不多说了,大家还是直接看代码吧~ 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package
test.refect;
public
class
Student {
// 姓名
private
String name;
// 年龄
private
String age;
// 住址
private
String address;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getAge() {
return
age;
}
public
void
setAge(String age) {
this
.age = age;
}
public
String getAddress() {
return
address;
}
public
void
setAddress(String address) {
this
.address = address;
}
@Override
public
String toString() {
return
"Student [name="
+ name +
", age="
+ age +
", address="
+ address +
"]"
;
}
public
void
sayHello(Book book){
System.out.println(book.getName());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
package
test.refect;
public
class
Book {
private
String name;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package
test.refect;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
java.net.URLDecoder;
import
java.util.Iterator;
import
net.sf.json.JSONObject;
public
class
Main {
public
static
void
main(String[] args)
throws
Exception {
//Student str --> Student 主类
String str =
"test.refect.Student"
;
Class<?> clazz = Class.forName(str);
//Book实体 str --> Book 参数类
String bookStr =
"test.refect.Book"
;
Class<?> bookClazz = Class.forName(bookStr);
//json --> Book 将参数类转为JSONOBJECT
String bookJson =
"{\"name\":\"Java\"}"
;
JSONObject jsonObject=JSONObject.fromObject(bookJson);
//实例化参数类
Object bookInStance = bookClazz.newInstance();
// 通过JSONOBJECT 为参数类赋值
Iterator<?> keys = jsonObject.keys();
while
(keys.hasNext()) {
Object key = keys.next();
Object value = jsonObject.get(key);
// 替换非法字符
String _key = String.valueOf(key).replaceFirst(
"\\W"
,
""
);
Field field = bookClazz.getDeclaredField(_key);
field.setAccessible(
true
);
field.set(bookInStance, URLDecoder.decode(String.valueOf(value),
"UTF-8"
));
field.setAccessible(
false
);
}
//将参数类注入到主类
Method method = clazz.getDeclaredMethod(
"sayHello"
, bookClazz);
//执行主类
method.invoke(clazz.newInstance(), bookInStance);
}
}
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/qq_39898191/article/details/112366508 。
最后此篇关于java通过cglib动态生成实体bean的操作的文章就讲到这里了,如果你想了解更多关于java通过cglib动态生成实体bean的操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!