获取实体类@注解信息_jquery获取class名称

获取实体类@注解信息_jquery获取class名称通过包名和注解获取类Classimportjava.io.File;importjava.io.IOException;importjava.lang.annotation.Annotation;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.Enumeration;importjava.util.HashSet;importjav

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

通过包名和注解获取类Class


import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
// 采用ClassLoader扫描
public class ClassUtils{ 

/** * 从包package中获取所有的Class * * @param packageName * @return */
public Set<Class<?>> getClasses(String packageName) throws Exception { 

// 第一个class类的集合
//List<Class<?>> classes = new ArrayList<Class<?>>();
Set<Class<?>> classes = new HashSet<>();
// 是否循环迭代
boolean recursive = true;
// 获取包的名字 并进行替换
String packageDirName = packageName.replace('.', '/');
// 定义一个枚举的集合 并进行循环来处理这个目录下的things
Enumeration<URL> dirs;
try { 

dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
// 循环迭代下去
while (dirs.hasMoreElements()) { 

// 获取下一个元素
URL url = dirs.nextElement();
// 得到协议的名称
String protocol = url.getProtocol();
// 如果是以文件的形式保存在服务器上
if ("file".equals(protocol)) { 

// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
// 以文件的方式扫描整个包下的文件 并添加到集合中
addClass(classes, filePath, packageName);
} else if ("jar".equals(protocol)) { 

// 如果是jar包文件
// 定义一个JarFile
JarFile jar;
try { 

// 获取jar
jar = ((JarURLConnection) url.openConnection()).getJarFile();
// 从此jar包 得到一个枚举类
Enumeration<JarEntry> entries = jar.entries();
// 同样的进行循环迭代
while (entries.hasMoreElements()) { 

// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
JarEntry entry = entries.nextElement();
String name = entry.getName();
// 如果是以/开头的
if (name.charAt(0) == '/') { 

// 获取后面的字符串
name = name.substring(1);
}
// 如果前半部分和定义的包名相同
if (name.startsWith(packageDirName)) { 

int idx = name.lastIndexOf('/');
// 如果以"/"结尾 是一个包
if (idx != -1) { 

// 获取包名 把"/"替换成"."
packageName = name.substring(0, idx).replace('/', '.');
}
// 如果可以迭代下去 并且是一个包
if ((idx != -1) || recursive) { 

// 如果是一个.class文件 而且不是目录
if (name.endsWith(".class") && !entry.isDirectory()) { 

// 去掉后面的".class" 获取真正的类名
String className = name.substring(packageName.length() + 1, name.length() - 6);
try { 

// 添加到classes
classes.add(Class.forName(packageName + '.' + className));
} catch (ClassNotFoundException e) { 

e.printStackTrace();
}
}
}
}
}
} catch (IOException e) { 

e.printStackTrace();
}
}
}
} catch (IOException e) { 

e.printStackTrace();
}
return classes;
}
public void addClass(Set<Class<?>> classes, String filePath, String packageName) throws Exception { 

File[] files = new File(filePath).listFiles(file -> (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory());
assert files != null;
for (File file : files) { 

String fileName = file.getName();
if (file.isFile()) { 

String classsName = fileName.substring(0, fileName.lastIndexOf("."));
if (!packageName.isEmpty()) { 

classsName = packageName + "." + classsName;
}
doAddClass(classes, classsName);
}
}
}
public void doAddClass(Set<Class<?>> classes, final String classsName) throws Exception { 

ClassLoader classLoader = new ClassLoader() { 

@Override
public Class<?> loadClass(String name) throws ClassNotFoundException { 

return super.loadClass(name);
}
};
classes.add(classLoader.loadClass(classsName));
}
public <A extends Annotation> Set<Class<?>> getAnnotationClasses(String packageName, Class<A> annotationClass) throws Exception { 

//找用了annotationClass注解的类
Set<Class<?>> controllers = new HashSet<>();
Set<Class<?>> clsList = getClasses(packageName);
if (clsList != null && clsList.size() > 0) { 

for (Class<?> cls : clsList) { 

if (cls.getAnnotation(annotationClass) != null) { 

controllers.add(cls);
}
}
}
return controllers;
}
}

Jetbrains全家桶1年46,售后保障稳定

自定义返回数据前端


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.tecloman.web.common.annotation.LangEntity;
import com.tecloman.web.common.annotation.Scanner;
import com.tecloman.web.common.utils.LangUtils;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Set;
/** * 中英文转换 * 2022-04-07 chens */
public class LangShift extends JsonSerializer<Object> { 

// 获取LangEntity下的所有类名
public static void main(String[] args) throws Exception { 

Set<Class<?>> set = new ClassUtils().getAnnotationClasses("com.tecloman.web.modules.hss.entity", LangEntity.class);
for (Class<?> aClass : set) { 

Field[] fields = aClass.getDeclaredFields();
System.out.println(fields.length);
for (Field field : fields) { 

System.out.println(field.getGenericType().toString());
//System.out.println(field);
}
System.out.println(aClass.getName());
}
}
// 也可以通过下面这种方式获取
// 获取打了Lang注解的类class
public static void main(String[] args) throws Exception { 

Set<Class<?>> set = new Scanner().getAnnotationClasses("com.tecloman.web.modules.hss.entity", LangEntity.class);
for (Class<?> aClass : set) { 

Field[] fields = aClass.getDeclaredFields();
System.out.println(fields.length);
for (Field field : fields) { 

System.out.println(field.getGenericType().toString());
// 判断字段上是否存在注解
boolean present = field.isAnnotationPresent(Lang.class);
if (present){ 

// 获取注解上的值
System.out.println(field.getAnnotation(Lang.class).value());
}
}
System.out.println(aClass.getName());
}
}
// 中英文转换 LangUtils.translate方法会将中文转成英文返回前端
// 上面的代码只是测试获取指定注解的类,和下面代码无关
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 

//返回数据给前端 value是属性值 调用实体类get方法获取,可以改变赋值
gen.writeString(LangUtils.translate(value.toString()));
}
}

实体类打上@JsonSerialize注解
有一些表的主键是雪花生成的比较长,返回前端会出现精度损失,转成字符串返回就可以了
@JsonSerialize(using = ToStringSerializer.class)

@Data
@LangEntity
public class HssEquipmentEntity implements Serializable { 

private static final long serialVersionUID = 1L;
@TableId
// @NotNull(message = "ID不能为空", groups = UpdateGroup.class) // 修改才会触发
private Long id;
// @Null(message = "项目ID不能修改", groups = UpdateGroup.class)
private Long projectId;
// Long返回前端会出现四舍五入的情况
@JsonSerialize(using = ToStringSerializer.class)
private Long orderId;
private Long mqttId;
/** * 名称 */
@JsonSerialize(using = LangShift.class)
private String name;
@JsonSerialize(using = LangShift.class)
private String sn;

也可以直接在实体的get方法上更改数据,但效率慢

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/228007.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm python interpreter_python interpreter什么意思

    pycharm python interpreter_python interpreter什么意思1,首先我们肯定要在Pycharm里建立一个新项目,有两个选项,一个建立新的虚拟的环境,一个基于已有的环境这里选择第一项。2,选择第一项之后会有两个解释器,一个虚拟的即location/venv/Scripts/python.exe,另一个需要基解释器即本地解释器/python.exe。关于第一项的解释我极力推荐此篇文章虚拟解释器的简单说明3,然后,如果在创建pycharm项目时项目解…

  • 安装VMware Tools显示灰色正确解决办法

    安装VMware Tools显示灰色正确解决办法百度了一天,重新安装了vm,在csdn逛了又逛,结合无数篇大神文章,最后自己句琢磨出了真正能点亮灰色按钮的方法。简单实在,大神们的方法实在千秋万变,一个比一个复杂,最后只能实现成功拖拽,而复制粘贴却还是不行。首先问题如下:解决办法如下:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤即可;3.再重启虚拟机,灰色字即点亮。…

  • 超分辨率重建 matlab,基于Matlab的多图像超分辨率重建算法

    【实例简介】多图像超分辨率的实现主要就是将具有相似而又不同却又互相补充信息的配准影像融到一起,得到非均匀采样的较高分辨率数据,复原需要亚像素精度的运动矢量场,然而它们之间的运动模型估计精确与否直接影响到重建的效果,因此影像配准和运动模型的估计精度是高分辨率图像重建的关键。由于实际中不同时刻获得的影像数据间存在较大的变形、缩放、旋转和平移,因此必须对其进行配准,在此基础上进行运动模型估计。然后通过频…

  • BeanUtils_BeanUtils

    BeanUtils_BeanUtils使用maven创建项目,pom文件&lt;dependency&gt; &lt;groupId&gt;commons-beanutils&lt;/groupId&gt; &lt;artifactId&gt;commons-beanutils&lt;/artifactId&gt; &lt;version&gt;1.9.3&lt;/version&gt; &lt;/depende

  • java 自行车_JAVA 2020款山地车盘点[通俗易懂]

    java 自行车_JAVA 2020款山地车盘点[通俗易懂]最近,笔者为大家带来了不少有关顶尖山地车型的文章,不少的观众老爷直呼看看就好,那今天我们就来看看入门山地车。JAVA作为近几年迅速崛起的国产品牌,推出的一系列产品中带着鲜明的“JAVA”风格。在山地市场上,JAVA主打入门车型,今天就让我们来看一看JAVA旗下的那些山地车。对啦,以下车型均可在JAVA旗舰店购买到哦。JAVAANIMA售价仅4500元的ANIMA采用JAVAADVANCENA…

  • import javax.servlet.http.HttpSession;异常

    import javax.servlet.http.HttpSession;异常

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号