首页 > 编程语言 >(JAVA)偶然看见有人在使用PropertyDescriptor,所以自己测试了一下性能

(JAVA)偶然看见有人在使用PropertyDescriptor,所以自己测试了一下性能

时间:2022-10-05 12:44:05浏览次数:48  
标签:JAVA String declaredFields System PropertyDescriptor Field 偶然 data public

package com.example.commons.test;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

public class Test {
private String name;
private String id;
private String data;
private String p;

public Test(String name, String id, String data, String p) {
this.name = name;
this.id = id;
this.data = data;
this.p = p;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}

public String getP() {
return p;
}

public void setP(String p) {
this.p = p;
}

public static void normal(List<Test> datas, Field[] declaredFields, Class<Test> clz) {
long start = System.nanoTime();
for (Test data : datas) {
data.getData();
data.getId();
data.getName();
data.getP();
}
System.out.printf("normal execute take up time:%d%n", System.nanoTime() - start);
}

public static <T> void fieldReflect(List<T> datas, Field[] declaredFields, Class<T> clz) throws IllegalAccessException {
long start = System.nanoTime();

for (T data : datas) {
for (Field declaredField : declaredFields) {
declaredField.get(data);
}
}
System.out.printf("fieldReflect execute take up time:%d%n",System.nanoTime() - start);
}



public static <T> void methodHandle(List<T> datas, Field[] declaredFields, Class<T> clz) throws Throwable {
long start = System.nanoTime();
List<MethodHandle> methodHandles = methodHandle(declaredFields, clz);
for (T data : datas) {
for (MethodHandle methodHandle : methodHandles) {
methodHandle.invoke(data);
}
}
System.out.printf("methodHandle execute take up time:%d%n", System.nanoTime() - start);

}

public static <T> void propertyDescriptor(List<T> datas, Field[] declaredFields, Class<T> clz) throws InvocationTargetException, IllegalAccessException {
long start = System.nanoTime();
List<PropertyDescriptor> descriptorArrayList = new ArrayList<PropertyDescriptor>();

for (Field declaredField : declaredFields) {
try {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(declaredField.getName(), clz);
descriptorArrayList.add(propertyDescriptor);
} catch (IntrospectionException e) {
System.err.println("PropertyDescriptor execute error!");
}
}

for (T data : datas) {
for (PropertyDescriptor propertyDescriptor : descriptorArrayList) {
propertyDescriptor.getReadMethod().invoke(data);
}
}
System.out.printf("PropertyDescriptor execute take up time:%d%n", System.nanoTime() - start);
}

public static void main(String[] args) {
ArrayList<Test> tests = new ArrayList<>();
for (int i = 0; i < 500; i++) {
tests.add(new Test("", i + "", "", ""));
}

Field[] declaredFields = Test.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
}
try {
normal(tests, declaredFields, Test.class);
fieldReflect(tests, declaredFields, Test.class);
methodHandle(tests, declaredFields, Test.class);
propertyDescriptor(tests, declaredFields, Test.class);
} catch (Throwable e) {
e.printStackTrace();
}

}

public static <T> List<MethodHandle> methodHandle(Field[] declaredFields, Class<T> clz) throws NoSuchFieldException, IllegalAccessException {
MethodHandles.Lookup lookup = MethodHandles.lookup();
ArrayList<MethodHandle> methodHandles = new ArrayList<>();
for (Field declaredField : declaredFields) {
methodHandles.add(lookup.findGetter(clz, declaredField.getName(), declaredField.getType()));
}
return methodHandles;
}
}

标签:JAVA,String,declaredFields,System,PropertyDescriptor,Field,偶然,data,public
From: https://www.cnblogs.com/ppx-doc/p/16755398.html

相关文章

  • JAVA中的可变形参
    例如声明一个类,Food,对方法进行重载classvoidFood(){      }classvoidFood(inta){      }//有一个形参aclassvoidFood(inta,intb){......
  • Java的重载,返回值到底能不能不一样?
    今天在复习八股的时候,突然看到八股提到Java的重载方法,方法返回值可以不同。于是我就去百度,发现答案是不可以。带着这个矛盾的结论,我仔细研读了几个帖子,其实结论是这样的:......
  • java split
    “.”和“|”都是转义字符,必须得加“\\”。如果用“.”作为分隔的话,必须写成String.split("\\."),这样才能正确的分隔开,不能用String.split(".")。如果用“|”作为分隔的......
  • 小猪学Java篇十九(Java基础语法------------Java基础语法总结)
    Java基础语法总结一,大纲:所学内容 (一),注释,标识符,关键字(二)、数据类型(三),类型转换(四),变量,常量(五),运算符(六),包机制,JavaDoc  二,逐个回顾(一),注释,标识符,关键......
  • 2022.10.5java特性和优势
    Java构建工具:Ant,Maven,Jekins应用服务器:Tomcat,Jettty,Jboss,Websphere,weblogicWeb开发:Struts,Spring,Hibernate,myBatis开发工具:Eclipse,Netbean,intellij......
  • JAVA方法的重载
    方法的重载两同一不同:同一个类中,允许存在一个以上的同名方法要求:参数个数不同,参数类型不同即可参数列表不同:参数个数不同,参数类型不同如与方法publicstaticvoid123(......
  • Java基础Day7-值传递和引用传递
    一、值传递Java都是值传递。值传递:是指在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数。值传递是对基本数据类型而......
  • Java_ practice_calculate 简易计算器
    publicclassPracticeDemo1{//计算器2.0publicstaticvoidmain(String[]args){count();}publicstaticvoidcount(){Scannerscan......
  • Java 中常用的进制转换
    前言所谓进制转换,就是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”和“位权”所构成。其中基数是指进位计数制中所采用的数码的个数,逢 ​​n......
  • Java集合(严重缺失版)
    此笔记源自于b站up主青空の霞光的视频和他的笔记。笔记出处:JavaSE笔记(四)泛型与集合类_青空の霞光的博客-CSDN博客失策了,我应该先看前面的数据结构的。找资源的时候要......