1、
com.esotericsoftware
反射Java。reflectasm
1.11.9
1、實體類
java cglib、package com.redisson;
/**
* @Description TODO
java listener。* @Date 2020/7/28 13:41
* @Author zsj
*/
jdbc工具包、public class Person {
public int age;
public String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String say(int age, String name) {
return "hh+" + age + "---" + name;
}
}
2、測試類
package com.redisson;
import com.esotericsoftware.reflectasm.ConstructorAccess;
import com.esotericsoftware.reflectasm.FieldAccess;
import com.esotericsoftware.reflectasm.MethodAccess;
/**
* @Description TODO
* @Date 2020/9/10 9:15
* @Author zsj
*/
public class ReflectasmTest {
public static void main(String[] args) {
// testReflectAsm4Name();
// testReflectAsm4Index();
// testFieldAccess();
// testConstructorAccess();
testIndex();
}
/**
* ReflectAsm反射調用方法
* 用名稱定位反射方法
*/
public static void testReflectAsm4Name() {
Person target = new Person();
MethodAccess access = MethodAccess.get(Person.class);//生成字節碼的方式創建UserServiceMethodAccess
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
Object object = access.invoke(target, "say", i, i + "hhhll");
// System.out.println(object);
}
long end = System.currentTimeMillis();
System.out.println("timeout=" + (end - start));//523 382 415 489 482
}
/**
* ReflectAsm反射調用方法
* 用方法和字段的索引定位反射方法,性能高
*/
public static void testReflectAsm4Index() {
Person target = new Person();
MethodAccess access = MethodAccess.get(Person.class);
int index = access.getIndex("say", int.class, String.class);
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
access.invoke(target, index, 1, "zhangsan");
}
long end = System.currentTimeMillis();
System.out.println("timeout=" + (end - start));//12 15 23 14 24
}
/**
* ReflectAsm反射來set/get字段值
*/
public static void testFieldAccess() {
Person target = new Person();
FieldAccess fieldAccess = FieldAccess.get(target.getClass());
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
fieldAccess.set(target, "age", 100);
}
long end = System.currentTimeMillis();
System.out.println("timeout=" + (end - start));
int state = (Integer) fieldAccess.get(target, "age");
System.out.println(state);
}
/**
* ReflectAsm反射來調用構造方法
*/
public static void testConstructorAccess() {
ConstructorAccessconstructorAccess = ConstructorAccess.get(Person.class);
Person person = constructorAccess.newInstance();
System.out.println(person);
}
/**
* 查找方法的索引
*/
public static void testIndex() {
Person target = new Person();
MethodAccess methodAccess = MethodAccess.get(target.getClass());
int index = methodAccess.getIndex("say", int.class, String.class);
System.out.println(index);
}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态