java反射获取属性值

java反射获取属性值其实可以分好多情况

1.考虑安全访问范围内的属性,没有权限访问到的属性不读取

2.不考虑从祖先类继承的属性,只获取当前类属性,包括四类访问权限,private,protect,default,public

3.考虑父类继承过来的属性,包括四类访问权限,private,protect,default,public

0

Activiti里附件Attachment管理(添加、查询、删除)

前言

在流程流转过程中可能会需要附带一些文件,每个任务办理人都可以上传附件,然后在流转过程中可能会被多次审批。

本篇将介绍附件的添加、查询、下载和删除代码操作。

代码示例

老规矩,本文只贴activiti附件相关的代码,其它基础代码可以参看《SpringBoot2.0整合activiti6示例

添加附件

activiti里添加附件有两种方式,文件方式url方式。

查询附件

下载附件

删除附件信息

+5

一文看懂为什么java反射性能慢、效率低

简介

稍微了解Java反射的伙伴都知道,java反射是存在一定的性能损耗的,那为什么使用反射创建类会比直接调用类构造函数创建对象慢呢?

java反射之所以慢,根本原因是编译器没法对反射相关的代码做优化。

我们都知道 Java 代码是需要编译才能在虚拟机里运行的,但其实 Java 的编译期是一段不确定的操作过程。因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程;也可能是程序运行期的即时编译器(JIT 编译器,Just In Time Compiler)把字节码文件编译成机器码的过程;还可能是静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成本地机器码的过程。

其中即时编译器(JIT)在运行期的优化过程对于程序运行来说更重要,Java虚拟机在编译阶段的代码优化就在这里进行,由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能要比非反射操作慢,因此应该避免在对性能敏感的应用程序中频繁使用Java反射来创建对象。

代码测试

结果

使用构造函数创建耗时:35
使用java反射创建耗时:465

扩展

如果确实需要比反射更快的速度,那么可以选择使用ASM或更高级别的库生成字节码。

ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。说白了asm是直接通过字节码来修改class文件。

ASM 第一次生成字节码比仅使用反射慢,但是一旦生成了字节码,它便与普通Java代码一样快,并且将由JIT编译器进行优化

我们熟知的CGLIB(Code Generation Library)的底层就是是通过 ASM 来实现的。

在CGLIB生成的代理上调用方法比Java的动态代理要快一些,因为CGLIB为其代理生成字节码,但是创建代理要慢一些。

总结

虽然java反射性能存在一定损耗,但并不是说我们就不该用java反射,到底使不使用java反射,应该根据我们的程序设计需求来决定。

如果你只是根据某些条件或配置文件来使用java反射创建对象,然后接下来就做其它操作(如数据库查询等),那其实java反射损耗的那点性能可以忽略不计。

但如果你想在连续循环中通过反射不断创建大量对象,那这是不可取的。

+6

java反射例子应用理解

一、前言

java反射是一个很好的机制,本文会提供一些java反射例子帮助读者对其有所理解。

类其实也是一种对象,是java.lang.Class类的实例。编译阶段类信息会被编译成.class文件,在类加载阶段,类加载器把.class文件读入JVM内存,生成java.lang.Class对象(这时已经可以通过Class对象查看类信息了),再经过类的连接(验证、准备、解析)与类的初始化阶段后即可使用类对象。我们通常使用的new关键字与反射创建实例时都会触发类初始化。

二、Java反射的常规使用步骤

1、获取目标类的java.lang.Class对象
2、获取目标类的信息(字段、方法、构造器、注解等)
3、生成并操作对象

三、获取目标类的java.lang.Class对象

这个是搞Java必会的基础,面试也常问,主要有三种方法:

注:为方便测试,定义一个User类,类定义如下:

测试

结果

其中,第一种和第二种方法都是直接根据类名获取Class对象,第二种方法具有如下两种优势:

1、编译阶段检查目标类是否存在,更安全;

2、无需调用方法,效率更高;

所以,我们通常推荐使用第二种方式获取Class对象,但是如果在编写程序的时候我们不知道这里需要产生哪个Class对象,只知道有个类名会传入,这种情况我们就只能使用第一种方式去获取Class对象,但这也是反射的精髓,动态而灵活。

四、获取目标类信息

1、获取成员变量信息

  • getFields()——获取所有公有成员变量
  • getField(String name)——获取指定名称的公有成员变量,会抛出NoSuchFieldException异常
  • getDeclaredFields()——获取所有成员变量,不关乎权限
  • getDeclaredFields()——获取指定名称的成员变量,不关乎权限,会抛出NoSuchFieldException异常

测试

结果

2、获取方法以及参数信息

  • getMethods()——获取所有公有方法
  • getMethod(String methodName, Class parameterTypes)——根据方法及形参列表获取公有方法,会抛出NoSuchMethodException异常
  • getDeclaredMethods()——获取所有方法
  • getDeclaredMethod(String methodName, Class parameterTypes)——根据方法及形参列表获取方法,会抛出NoSuchMethodException异常
  • getParameters()——获取所有形参

测试

结果

3、获取构造方法信息,和上面一样

  • getConstructors()——获取所有公有构造器
  • getConstructor(Class parameterTypes)——根据形参列表获取某一公有构造器
  • getDeclaredConstructors()——获取所有构造器
  • getDeclaredConstructor(Class parameterTypes)——根据形参列表获取某一构造器

4、获取注解,关键字为annotation,也是和上面一样

五、使用反射生成并操作对象

1、创建对象,两种方式:

Class对象的newInstance()方法——调用默认构造创建实例
Class对象获取指定Constructor对象,再调用该对象的newInstance()方法

测试

2、调用方法

Method对象的invoke(Object obj, Object args)——其中,第一个参数obj是执行该方法的主调(也就是一个拥有这个方法的对象),后面的arg是调用该方法的实参。

测试

3、修改成员变量值

Field对象的getXXX(Object obj)——obj为拥有该属性的对象,XXX为8种基本类型,代表着成员变量类型,如果成员变量为引用类型,则去掉XXX。
Field对象的setXXX(Object obj, XXX val)——obj同上,val为要设置的值

测试

好了,相信大家应该理解了上面的应用java反射例子了。

有问题欢迎留言指正。

0

java反射机制有什么用?

Java语言有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

java反射机制有什么用?

在Java环境中,反射机制允许程序在执行时获取某个类自身的定义信息,例如属性和方法等。也可以实现动态创建类的对象、变更属性的内容或执行特定的方法的功能。从而使Java具有动态语言的特性,增强了程序的灵活性和可移植性。

Java反射机制主要用于实现以下功能,看完以下几点相信你会对java反射机制有什么用有清晰的了解。

  • 在运行时判断任意一个对象所属的类型。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法,甚至可以调用private方法。
  • 生成动态代理。

注意:上述功能都是在运行时环境中,而不是在编译时环境中。

代码示例

性能损耗

反射在性能方面会有一定的损耗,用于字段和方法接入时反射要远慢于直接写代码。如果它作为程序运行中相对很少涉及的部分将不会造成影响,因为即使测试最坏情况下的计时图显示的反射操作也只耗用几微秒。

0

Mars-java 3.0.15 发布,开始支持组件化

最近,Mars-java发布了3.0.15版本,将开始支持组件化。

Mars是一个声明式API编程框架,可以帮助你很快的建立后端服务接口。

开放API,欢迎大家一起来开发组件

无论你是谁,只要你有兴趣,就可以基于Mars-java开发组件,为提升后端开发效率出一份力

开发方式可以查看文档:自定义组件

推出Mars-cloud组件

以一种很小巧,快速的方式,将Mars-java改造成微服务,从Mars-java项目升级到微服务,只需要简单的三步,是真的简单哦。

一、在Mars-java项目中添加如下jar包

二、配置类换一个父类,实现getCloudConfig方法

将Mars-java项目的的配置类换一个父类(继承MarsCloudConfig)

三、启动类稍作修改

完成以上三步,一个Mars-java项目就变成了Mars-cloud项目了。

推出Mars-users组件
登录注册等一系列的用户基础操作 0代码即可实现

一、在你的项目中添加如下jar包

二、导入组件

三、调用对应的API即可完成对应功能

mars-users文档

Mars-Java官网:https://www.mars-framework.com/

0

SpringBoot内嵌Tomcat参数优化

我们都知道SpringBoot默认使用的是Tomcat作为WebServer。为了更好的优化Tomcat使用,我们需要知道一些必要的参数设置。

注意要结合自己系统的实际需求设置哦。

0

mybatis查询返回list,包括resultType和resultMap两种写法

mybatis查询返回List集合时,需要将resultType的值定义为集合中的元素类型,而不是返回集合本身。

代码示例

ok,mybatis查询返回list写法就是这么简单。

0

一文告诉你java是高级语言吗?

很多刚接触java的朋友可能会疑惑,java是高级语言吗

可以肯定的说,Java语言是高级语言。Java和C都是计算机的高级语言。相对低级语言来说,高级语言更接近人类的思维方式,更容易理解和掌握,用高级语言编写程序时,感觉像是学生写作文一样,既能表达准确又不那么吃力。

低级语言分为机器语言(二进制语言)和汇编语言(符号语言)。早期的程序开发,用的是汇编语言,编程难度较大,因为汇编语言不容易理解和掌握。汇编语言跟计算机的硬件关系密切,涉及到计算机底层的指令系统。

我们知道,高级语言最终还是要编译成低级语言,计算机才能读懂和执行的。

高级语言与计算机底层的硬件与指令没什么关系,可以很方便地表示数据的运算和程序的控制结构,描述各种算法,容易学习掌握等等。但是,用高级语言编写的程序,编译生成的指令代码比汇编语言编写的程序的代码的要长,执行的速度也慢。

所以,汇编语言还是有它的好处的,因为汇编语言能直接被机器所读懂并执行了!速度快,还能开发与硬件相关的程序!

C跟Java的区别主要在于编程思维的特点,C是面向过程,Java是面向对象。相比面向过程,面向对象的优点是:可重用性高、可扩展性强、可维护性好。

这两种思维对我们人类解决问题时,都是很重要的,面向过程与面向对象各有优劣,各有侧重点。而面向对象被应用得更广泛。

java是高级语言吗,看到这相信大家会有所了解了。

+1

Activiti删除流程实例

省略了其它和本例无关的代码,需要查看请参阅《SpringBoot2.0整合activiti6示例

+2