反射
package entity;
public class User {
private int id;
private int age;
private String name;
public User ( ) {
super ( ) ;
}
public User ( int id, int age, String name) {
super ( ) ;
this . id = id;
this . age = age;
this . name = name;
}
public int getId ( ) {
return id;
}
public void setId ( int id) {
this . id = id;
}
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;
}
@Override
public String toString ( ) {
return "User [id=" + id + ", age=" + age + ", name=" + name + "]" ;
}
}
package entity;
import java. util. List;
import java. util. Map;
public class TestBean {
long sum = 0 ;
public long getSum ( ) {
return sum;
}
public void setSum ( long sum) {
this . sum = sum;
}
public void test01 ( Map< String, User> map, List< User> list) { }
public Map< Integer, User> test02 ( ) {
return null;
}
@Override
public String toString ( ) {
return "TestBean [sum=" + sum + "]" ;
}
}
package Test;
import java. lang. reflect. Constructor;
import java. lang. reflect. Field;
import java. lang. reflect. Method;
import java. lang. reflect. ParameterizedType;
import java. lang. reflect. Type;
import java. util. List;
import java. util. Map;
import org. junit. jupiter. api. Test;
import entity. TestBean;
import entity. User;
class Reflect_1 {
@Test
void load ( ) {
User user = new User ( 1 , 2 , "张三" ) ;
Class clzz = user. getClass ( ) ;
System. out. println ( "clzz ==> " + clzz) ;
clzz = User. class ;
System. out. println ( "clzz ==> " + clzz) ;
try {
String path = "entity.User" ;
clzz = Class. forName ( path) ;
System. out. println ( "clzz ==> " + clzz) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
@Test
public void getStructInfo ( ) {
String path = "entity.User" ;
try {
Class clzz = Class. forName ( path) ;
System. out. println ( "类全名 :" + clzz. getName ( ) ) ;
System. out. println ( "类名: " + clzz. getSimpleName ( ) ) ;
Field [ ] fields = clzz. getFields ( ) ;
for ( Field temp : fields) {
System. out. println ( " 属性1:" + temp) ;
}
fields = clzz. getDeclaredFields ( ) ;
for ( Field temp : fields) {
System. out. println ( " 属性2:" + temp) ;
}
Field f = clzz. getDeclaredField ( "name" ) ;
System. out. println ( " 获取指定属性信息:" + f) ;
Method [ ] methods = clzz. getDeclaredMethods ( ) ;
for ( Method method : methods) {
System. out. println ( " 获得方法信息:" + method) ;
}
Method m1 = clzz. getDeclaredMethod ( "getName" ) ;
System. out. println ( " 获取无参指定方法:" + m1) ;
Method m2 = clzz. getDeclaredMethod ( "setName" , String. class ) ;
System. out. println ( " 获取无参指定方法:" + m2) ;
Constructor [ ] constructors = clzz. getDeclaredConstructors ( ) ;
for ( Constructor constructor : constructors) {
System. out. println ( " 获得构造器信息:" + constructor) ;
}
Constructor c = clzz. getDeclaredConstructor ( ) ;
System. out. println ( " 获得无参构造器信息:" + c) ;
c = clzz. getDeclaredConstructor ( int . class , int . class , String. class ) ;
System. out. println ( " 有参构造器信息:" + c) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
@Test
public void operation ( ) {
String path = "entity.User" ;
try {
Class< User> clzz = ( Class< User> ) Class. forName ( path) ;
User u = clzz. getDeclaredConstructor ( ) . newInstance ( ) ;
u. setName ( "张三" ) ;
u. setAge ( 12 ) ;
u. setId ( 15 ) ;
System. out. println ( u) ;
User user = clzz. getDeclaredConstructor ( ) . newInstance ( ) ;
Method method = clzz. getDeclaredMethod ( "setName" , String. class ) ;
method. invoke ( user, "李四" ) ;
System. out. println ( user) ;
User user2 = clzz. getDeclaredConstructor ( ) . newInstance ( ) ;
Field f = clzz. getDeclaredField ( "name" ) ;
f. setAccessible ( true ) ;
f. set ( user2, "王五" ) ;
System. out. println ( user2. getName ( ) ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
@Test
public void reflectEfficiency ( ) {
TestBean t = new TestBean ( ) ;
long startTime1 = System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 1000000000 L; i++ ) {
t. setSum ( i) ;
}
long endTime1 = System. currentTimeMillis ( ) ;
System. out. println ( "和:" + t. getSum ( ) ) ;
System. out. println ( "普通方法调用 10亿次耗时:" + ( endTime1 - startTime1) ) ;
TestBean t2 = new TestBean ( ) ;
Class clzz2 = t2. getClass ( ) ;
try {
long startTime2 = System. currentTimeMillis ( ) ;
Method m2 = clzz2. getDeclaredMethod ( "setSum" , long . class ) ;
for ( int i = 0 ; i < 1000000000 L; i++ ) {
m2. invoke ( t2, i) ;
}
long endTime2 = System. currentTimeMillis ( ) ;
System. out. println ( "和:" + t. getSum ( ) ) ;
System. out. println ( "反射方法调用 10亿次耗时:" + ( endTime2 - startTime2) ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
TestBean t3 = new TestBean ( ) ;
Class clzz3 = t3. getClass ( ) ;
try {
Method m3 = clzz3. getDeclaredMethod ( "setSum" , long . class ) ;
m3. setAccessible ( true ) ;
long startTime3 = System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 1000000000 L; i++ ) {
m3. invoke ( t3, i) ;
}
long endTime3 = System. currentTimeMillis ( ) ;
System. out. println ( "和:" + t. getSum ( ) ) ;
System. out. println ( "反射方法调用 10亿次耗时:" + ( endTime3 - startTime3) ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
@Test
public void operationGenericity ( ) {
Class clzz = TestBean. class ;
try {
Method m = clzz. getMethod ( "test01" , Map. class , List. class ) ;
Type[ ] t = m. getGenericParameterTypes ( ) ;
for ( Type paramType: t) {
System. out. println ( "#:" + paramType) ;
if ( paramType instanceof ParameterizedType ) {
Type[ ] genericTypes = ( ( ParameterizedType) paramType) . getActualTypeArguments ( ) ;
for ( Type genericType : genericTypes) {
System. out. println ( "泛型类型: " + genericType) ;
}
}
}
System. out. println ( "指定方法返回值泛型" ) ;
Method m2 = clzz. getMethod ( "test02" ) ;
Type returnType = m2. getGenericReturnType ( ) ;
if ( returnType instanceof ParameterizedType ) {
Type[ ] genericTypes = ( ( ParameterizedType) returnType) . getActualTypeArguments ( ) ;
for ( Type genericType: genericTypes) {
System. out. println ( "泛型类型:" + genericType) ;
}
}
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
}