1 实体类
package common;
/**
* User实体
* @author xindaqi
* @since 2021-01-23
*/
public class UserEntity {
private String uid;
private String nickname;
private String sex;
public UserEntity() {}
public UserEntity(String uid, String nickname, String sex) {
this.uid = uid;
this.nickname = nickname;
this.sex = sex;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "UserEntity{" +
"uid=" + uid +
", nickname='" + nickname + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
2 反射获取类信息
2.1 方法
- 获取类中声明的方法
Method method = clzz.getDeclaredMthod("方法名");
Method[] methods = clzz.getDeclaredMethods();
- 执行方法
method.invoke(clzz.instance(), "参数值");
- 获取类中声明的属性
Field field = clzz.getDeclaredField("属性名");
Field[] fields = clss.getDeclaredFields();
2.2 用例
package reflect;
import common.UserEntity;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.logging.Logger;
/**
* 反射测试.
*
* @author xindaqi
* @since 2021/4/16 10:26
*/
public class ReflectTest {
private static final Logger logger = Logger.getLogger("ReflectTest");
/**
* 反射获取声明的方法,并调用
*
* @param clzz 类
*/
void reflectMethodTest(Class<?> clzz) {
String className = clzz.getName();
String typeName = clzz.getTypeName();
String simpleName = clzz.getSimpleName();
try {
Object obj = clzz.newInstance();
Method[] methods = clzz.getDeclaredMethods();
for(Method method : methods) {
logger.info("通过反射获取声明的方法名称:" + method.getName());
}
Method method = clzz.getDeclaredMethod("setUid", String.class);
method.invoke(obj, "1234");
Method getUidMethod = clzz.getMethod("getUid");
String uid = getUidMethod.invoke(obj).toString();
logger.info("我是反射获取的uid:" + uid);
} catch(Exception e) {
throw new RuntimeException(e);
}
logger.info("类名称:" + className + ",类型名称:" + typeName + ",Simple名称:" + simpleName);
}
/**
* 反射设置属性与获取属性值
*
* @param clzz 类
*/
void reflectField(Class<?> clzz) {
try {
Object obj = clzz.newInstance();
Field[] fields = clzz.getDeclaredFields();
for(Field field : fields) {
logger.info("通过反射获取声明的属性名:" + field.getName());
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clzz);
Method method = pd.getWriteMethod();
if(field.getType() == String.class) {
method.invoke(obj, "xiaoxiao");
}
if(field.getType() == Integer.class) {
method.invoke(obj, 123);
}
}
for(Field field : fields) {
PropertyDescriptor pd1 = new PropertyDescriptor(field.getName(), clzz);
Method method1 = pd1.getReadMethod();
logger.info("我是反射获取的属性值:" + method1.invoke(obj));
}
} catch(Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
UserEntity userEntity = new UserEntity();
ReflectTest reflectTest = new ReflectTest();
reflectTest.reflectMethodTest(UserEntity.class);
reflectTest.reflectField(UserEntity.class);
}
}
3 结果
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:toString
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:setUid
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:getUid
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:getNickname
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:setSex
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:setNickname
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 通过反射获取声明的公有方法名称:getSex
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 我是反射获取的uid:1234
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectMethodTest
信息: 类名称:common.UserEntity,类型名称:common.UserEntity,Simple名称:UserEntity
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 通过反射获取的属性名:uid
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 通过反射获取的属性名:nickname
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 通过反射获取的属性名:sex
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 我是反射获取的属性值:xiaoxiao
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 我是反射获取的属性值:xiaoxiao
四月 16, 2021 4:08:33 下午 reflect.ReflectTest reflectField
信息: 我是反射获取的属性值:xiaoxiao