/*
这个Java类是一个反射工具类,它提供了很多静态方法来操作Java对象的反射功能,如调用getter和setter方法、访问私有变量、调用私有方法、获取泛型类型Class等。以下是每个方法的简单解释:
1. `invokeGetter`:调用对象的getter方法。
2. `invokeSetter`:调用对象的setter方法。
3. `getFieldValue`:直接读取对象的属性值,无视private/protected修饰符,不经过getter函数。
4. `setFieldValue`:直接设置对象的属性值,无视private/protected修饰符,不经过setter函数。
5. `invokeMethod`:直接调用对象的方法,无视private/protected修饰符。匹配方法名和参数类型。
6. `invokeMethodByName`:直接调用对象的方法,只匹配函数名,如果有多个同名函数调用第一个。
7. `getAccessibleField`:循环向上转型,获取对象的DeclaredField,并强制设置为可访问。
8. `getAccessibleMethod`:循环向上转型,获取对象的DeclaredMethod,并强制设置为可访问。匹配方法名和参数类型。
9. `getAccessibleMethodByName`:循环向上转型,获取对象的DeclaredMethod,并强制设置为可访问。只匹配函数名。
10. `makeAccessible`:改变私有或受保护的方法或成员变量为公共的。
11. `getClassGenricType`:通过反射获取Class定义中声明的泛型参数的类型。如果无法找到,则返回Object.class。这个方法也可以接受一个索引参数来获取父类的泛型参数类型。
12. `getUserClass`:判断对象是否是CGLIB动态生成的类,如果是的话返回被代理的原始类。
13. `convertReflectionExceptionToUnchecked`:将反射时的checked exception转换为unchecked exception。
14. `getFields`:获取所有的字段,包括所有父类,除Object外。这个方法会遍历所有的父类并获取其声明的字段,然后强制设置为可访问状态。如果在获取过程中发生异常,会记录日志并继续执行。
*/
#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
/*******************************************************************************
* Copyright (c) 2005, 2014 springside.github.io
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
*******************************************************************************/
package ${package}.${parentArtifactId}.biz.util;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import java.lang.reflect.*;
/**
* 反射工具类,提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
*
* @author kangyonggan
* @since 2016/12/10
*/
@Log4j2
public class Reflections {
private static final String SETTER_PREFIX = "set";
private static final String GETTER_PREFIX = "get";
private static final String CGLIB_CLASS_SEPARATOR = "${symbol_dollar}${symbol_dollar}";
/**
* 调用Getter方法.
*/
public static Object invokeGetter(Object obj, String propertyName) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(propertyName);
return invokeMethod(obj, getterMethodName, new Class[]{}, new Object[]{});
}
/**
* 调用Setter方法, 仅匹配方法名。
*/
public static void invokeSetter(Object obj, String propertyName, Object value) {
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(propertyName);
invokeMethodByName(obj, setterMethodName, new Object[]{value});
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public static Object getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
Object result = null;
try {
result = field.get(obj);
} catch (IllegalAccessException e) {
log.error("不可能抛出的异常{}", e.getMessage());
}
return result;
}
/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
*/
public static void setFieldValue(final Object obj, final String fieldName, final Object value) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
try {
field.set(obj, value);
} catch (IllegalAccessException e) {
log.error("不可能抛出的异常:{}", e.getMessage());
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符.
* 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
* 同时匹配方法名+参数类型,
*/
public static Object invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
final Object[] args) {
Method method = getAccessibleMethod(obj, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}
try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符,
* 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个。
*/
public static Object invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
Method method = getAccessibleMethodByName(obj, methodName);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}
try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
* <p>
* 如向上转型到Object仍无法找到, 返回null.
*/
public static Field getAccessibleField(final Object obj, final String fieldName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(fieldName, "fieldName can't be blank");
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
Field field = superClass.getDeclaredField(fieldName);
makeAccessible(field);
return field;
} catch (NoSuchFieldException e) {// NOSONAR
}
}
return null;
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 匹配函数名+参数类型。
* <p>
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethod(final Object obj, final String methodName,
final Class<?>... parameterTypes) {
Validate.notNull(obj, "object can't b
没有合适的资源?快使用搜索试试~ 我知道了~
(源码)基于SpringBoot和Shiro的CMS系统原型.zip
共748个文件
js:210个
gif:157个
java:115个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 86 浏览量
2024-11-17
15:18:05
上传
评论
收藏 3.7MB ZIP 举报
温馨提示
# 基于Spring Boot和Shiro的CMS系统原型 ## 项目简介 本项目是一个基于Spring Boot和Shiro框架的内容管理系统(CMS)原型。它旨在提供一个快速搭建类似CMS系统的项目模板,通过一键生成的方式,减少手动创建项目、模块和拷贝修改的工作量。系统结构清晰,模块之间依赖关系明确,主要技术和框架包括Spring、SpringMVC、Mybatis、Shiro、Redis、Dubbo等。 ## 项目的主要特性和功能 ### 系统结构 web模块 依赖 biz模块 biz模块 依赖 service模块 和 dao模块 service模块 依赖 model模块 dao模块 依赖 model模块 ### 主要技术和框架 Spring SpringMVC Mybatis Shiro Redis Dubbo MySQL Freemarker Ace Admin Ajax FTP
资源推荐
资源详情
资源评论
收起资源包目录
(源码)基于SpringBoot和Shiro的CMS系统原型.zip (748个子文件)
ace.min.css 391KB
bootstrap.css 151KB
ace-rtl.min.css 129KB
bootstrap.min.css 120KB
bootstrap.min.css 109KB
ace-part2.min.css 107KB
ace-skins.min.css 84KB
datepicker.min.css 31KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
default.css 21KB
font-awesome.min.css 21KB
bootstrap-editable.min.css 17KB
select2.min.css 15KB
jquery-ui.min.css 15KB
bootstrap-datetimepicker.min.css 11KB
ui.jqgrid.min.css 11KB
chosen.min.css 11KB
fullcalendar.min.css 10KB
dropzone.min.css 10KB
ace-ie.min.css 9KB
shCoreEclipse.css 9KB
shCoreDjango.css 9KB
shCoreFadeToGrey.css 9KB
shCoreDefault.css 9KB
shCoreMidnight.css 9KB
shCoreRDark.css 9KB
shCoreEmacs.css 9KB
shCoreMDUltra.css 9KB
shCore.css 6KB
zTreeStyle.css 6KB
daterangepicker.min.css 5KB
shThemeEclipse.css 3KB
colorbox.min.css 3KB
jquery.fullPage.css 3KB
qq.css 3KB
shThemeDjango.css 3KB
jquery-ui.custom.min.css 3KB
shThemeFadeToGrey.css 3KB
bootstrap-timepicker.min.css 3KB
shThemeDefault.css 3KB
shThemeMidnight.css 3KB
shThemeRDark.css 3KB
shThemeEmacs.css 3KB
shThemeMDUltra.css 3KB
bootstrap-markdown.min.css 3KB
bootstrap-markdown.min.css 3KB
simple.css 2KB
colorpicker.min.css 2KB
fullcalendar.print.min.css 2KB
jquery.gritter.min.css 2KB
bootstrap-duallistbox.min.css 1KB
bootstrap-multiselect.min.css 1KB
prettify.css 973B
app.css 668B
prettify.min.css 532B
ace-fonts.min.css 326B
pace.min.css 222B
fontawesome-webfont.eot 55KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regular.eot 20KB
email.ftl 20KB
spring.ftl 15KB
profile.ftl 10KB
index.ftl 4KB
form-modal.ftl 4KB
common.ftl 4KB
form.ftl 3KB
form-modal.ftl 3KB
layout.ftl 3KB
index.ftl 3KB
navbar.ftl 3KB
reset.ftl 3KB
reset-password.ftl 3KB
form-modal.ftl 3KB
password-modal.ftl 2KB
list.ftl 2KB
list.ftl 2KB
list.ftl 2KB
form-modal.ftl 2KB
list.ftl 2KB
menus-modal.ftl 2KB
sidebar.ftl 2KB
list.ftl 2KB
error-layout.ftl 2KB
table-tr.ftl 1KB
detail-modal.ftl 1KB
roles-modal.ftl 1KB
table-tr.ftl 1KB
index.ftl 1KB
detail.ftl 1KB
detail-modal.ftl 1KB
table-tr.ftl 1KB
table-tr.ftl 788B
modal.ftl 711B
menu.ftl 668B
attachment.ftl 644B
table-tr.ftl 597B
index.ftl 503B
delete.ftl 495B共 748 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
t0_54coder
- 粉丝: 4693
上传资源 快速赚钱
我的内容管理
展开
我的资源
快来上传第一个资源
我的收益 登录查看自己的收益
我的积分
登录查看自己的积分
我的C币
登录后查看C币余额
我的收藏
我的下载
下载帮助
前往需求广场,查看用户热搜最新资源
- Python3的程序更新
- Netflix容器化实践之路
- C语言实现顺序表功能完整代码示例
- xisohi-CHINA-IPTV-21664-1755682124657.zip
- 基于java 采集麦克风声音并指定输出格式
- 数据与应用安全研究
- Netflix容器化实践
- 基于ARM11嵌入式Linux平台开发的QT48人脸识别系统-包含过期商业保密算法库的嵌入式人脸识别项目-用于嵌入式设备人脸识别开发的参考项目-涉及QTCreator开发环境-.zip
- 三维电路多端互连时序优化
- EFI for b365m-i5 9400F-CLOVER.rar
- 基于微信小程序的培训机构全流程智能课时管理系统-学员端预约扣课-老师端排课管理-后台课时统计-课程预约登记-课时消耗查询-课时增减管理-预约记录导出-云函数数据库-腾讯云开发解决方.zip
- Android笨重文件分段传输
- HTML5版本的全套股票行情图表集
- 多媒体数据挖掘入门
- 开发基于Python的Keras框架矩阵运算代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功