当前位置:   article > 正文

java通过反射获取类名、属性名称_object.getclass().getdeclaredmethod(methodname);

object.getclass().getdeclaredmethod(methodname);

getMethods():获取当前类及所有继承的、父类的public修饰的方法,仅包括public。
getDeclaredMethods():获取当前类的所有方法,包括public/private/protected/default修饰的方法。
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。 
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

getAnnotation()方法可用于获取指定类型的注释,若不存在则返回null。

  1. Field[] fields = tClass.getDeclaredFields();
  2. List<String> headers = new ArrayList<>();
  3. for (Field field: fields) {
  4. ExcelProperty property = field.getAnnotation(ExcelProperty.class);
  5. if (property != null) {
  6. String[] s = property.value();
  7. if (s.length > 0) {
  8. headers.add(s[0]);
  9. }
  10. }
  11. }
  12. String[] strings = new String[headers.size()];
  13. headers.toArray(strings);
  14. return strings;
  15. }

定义反射工具类

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. /**
  5. * 方法类
  6. */
  7. public class ReflectionUtils {
  8. /**
  9. * 循环向上转型
  10. * @param object 子类对象
  11. * @param methodName 父类中的方法名
  12. * @param parameterTypes 父类中的方法参数类型
  13. * @return 父类中的方法对象
  14. */
  15. public static Method getDeclaredMethod(Object object, String methodName, Class<?>... parameterTypes){
  16. Method method = null;
  17. for(Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()){
  18. try {
  19. method = clazz.getDeclaredMethod(methodName, parameterTypes);
  20. return method;
  21. } catch (NoSuchMethodException e) {
  22. //不需要处理
  23. //不断向父类查询是否有某个方法
  24. }
  25. }
  26. return null;
  27. }
  28. /**
  29. * 直接调用对象方法,而忽略修饰符(private, protected, default)
  30. * @param object 子类对象
  31. * @param methodName 父类的方法名
  32. * @param parameterTypes 父类的方法参数类型
  33. * @param parameters 父类的方法参数
  34. * @return 父类中方法的执行结果
  35. */
  36. public static Object invokeMethod(Object object, String methodName, Class<?>[] parameterTypes,
  37. Object[] parameters){
  38. //根据对象、方法名和对应的方法参数,通过取Method对象
  39. Method method = getDeclaredMethod(object, methodName, parameterTypes);
  40. //控制Java对方法进行检查,主要针对私有方法而言
  41. method.setAccessible(true);
  42. try {
  43. if(null != method) {
  44. //调用objectmethod所代表的方法,其方法的参数是parameters
  45. return method.invoke(object, parameters);
  46. }
  47. } catch (IllegalAccessException e) {
  48. e.printStackTrace();
  49. } catch (InvocationTargetException e) {
  50. e.printStackTrace();
  51. }
  52. return null;
  53. }
  54. /**
  55. * 循环向上转型, 获
  56. * @param object : 子类对象
  57. * @param fieldName : 父类中
  58. * @return 父类中
  59. * */
  60. public static Field getDeclaredField(Object object, String fieldName){
  61. Field field = null;
  62. Class<?> clazz = object.getClass();
  63. for(;clazz != Object.class; clazz = clazz.getSuperclass()){
  64. try {
  65. field = clazz.getDeclaredField(fieldName);
  66. return field;
  67. } catch (NoSuchFieldException e) {
  68. //不需要处理
  69. //不断向父类查询是否有某个字段
  70. }
  71. }
  72. return null;
  73. }
  74. /**
  75. * 直接设置对象的属性值,忽略private/protected修饰符
  76. * @param object 子类对象
  77. * @param fieldName 父类中的字段名
  78. * @param value 将要设置的值
  79. */
  80. public static void setFieldValue(Object object, String fieldName, Object value){
  81. //根据对象和属性名通过取Field对象
  82. Field field = getDeclaredField(object, fieldName);
  83. //控制Java对其的检查
  84. field.setAccessible(true);
  85. //object中field所代表的的值设置为value
  86. try {
  87. field.set(object, value);
  88. } catch (IllegalAccessException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. /**
  93. * 直接读的属性值, 忽略 private/protected 修饰符, 也
  94. * @param object : 子类对象
  95. * @param fieldName : 父类中
  96. * @return : 父类中 */
  97. public static Object getFieldValue(Object object, String fieldName){
  98. //根据对象和属性名通过取Field对象
  99. Field field = getDeclaredField(object, fieldName);
  100. field.setAccessible(true);
  101. try {
  102. return field.get(object);
  103. } catch (IllegalAccessException e) {
  104. e.printStackTrace();
  105. }
  106. return null;
  107. }
  108. }

定义父类的属性和方法

  1. //父类
  2. public class Parent {
  3. public String publicField = "1";
  4. String defaultField = "2";
  5. protected String protectedField = "3";
  6. private String privateField = "4";
  7. public void publicMethod(String name) {
  8. System.out.println("publicMethod...");
  9. }
  10. void defaultMethod() {
  11. System.out.println("defaultMethod...");
  12. }
  13. protected void protectedMethod() {
  14. System.out.println("protectedMethod...");
  15. }
  16. private void privateMethod() {
  17. System.out.println("privateMethod...");
  18. }
  19. }
  20. //子类
  21. public class Son extends Parent{
  22. }

测试反射

  1. import org.junit.Test;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. public class ReflectionUtilsTest {
  5. /**
  6. * 测试获取父类的方法实例
  7. */
  8. @Test
  9. public void testGetDeclaredMethod(){
  10. Object obj = new Son();
  11. //public方法
  12. Method publicMethod = ReflectionUtils.getDeclaredMethod(obj, "publicMethod", String.class);
  13. System.out.println(publicMethod.getName());
  14. //default方法
  15. Method defaultMethod = ReflectionUtils.getDeclaredMethod(obj, "defaultMethod") ;
  16. System.out.println(defaultMethod.getName());
  17. //protected方法
  18. Method protectedMethod = ReflectionUtils.getDeclaredMethod(obj, "protectedMethod") ;
  19. System.out.println(protectedMethod.getName());
  20. //私有方法
  21. Method privateMethod = ReflectionUtils.getDeclaredMethod(obj, "privateMethod") ;
  22. System.out.println(privateMethod.getName());
  23. }
  24. /**
  25. * 调用父类的方法
  26. */
  27. @Test
  28. public void testInvokeMethod(){
  29. Object obj = new Son();
  30. //调用
  31. ReflectionUtils.invokeMethod(obj, "publicMethod", String.class, "2342");
  32. //调用
  33. ReflectionUtils.invokeMethod(obj, "defaultMethod", null , null) ;
  34. //调用
  35. ReflectionUtils.invokeMethod(obj, "protectedMethod", null , null) ;
  36. //调用
  37. ReflectionUtils.invokeMethod(obj, "privateMethod", null , null) ;
  38. }
  39. /**
  40. * 测试获父类的各个属性名
  41. */
  42. @Test
  43. public void testGetDeclaredField() {
  44. Object obj = new Son() ;
  45. //获DeclaredField
  46. Field publicField = ReflectionUtils.getDeclaredField(obj, "publicField") ;
  47. System.out.println(publicField.getName());
  48. //获DeclaredField
  49. Field defaultField = ReflectionUtils.getDeclaredField(obj, "defaultField") ;
  50. System.out.println(defaultField.getName());
  51. //获DeclaredField
  52. Field protectedField = ReflectionUtils.getDeclaredField(obj, "protectedField") ;
  53. System.out.println(protectedField.getName());
  54. //获DeclaredField
  55. Field privateField = ReflectionUtils.getDeclaredField(obj, "privateField") ;
  56. System.out.println(privateField.getName());
  57. }
  58. //设置属性值
  59. @Test
  60. public void testSetFieldValue() {
  61. Object obj = new Son() ;
  62. System.out.println("原来的各个属性的值: ");
  63. System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField"));
  64. System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField"));
  65. System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField"));
  66. System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField"));
  67. ReflectionUtils.setFieldValue(obj, "publicField", "a") ;
  68. ReflectionUtils.setFieldValue(obj, "defaultField", "b") ;
  69. ReflectionUtils.setFieldValue(obj, "protectedField", "c") ;
  70. ReflectionUtils.setFieldValue(obj, "privateField", "d") ;
  71. System.out.println("***********************************************************");
  72. System.out.println("将属性值改变后的各个属性值: ");
  73. System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField"));
  74. System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField"));
  75. System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField"));
  76. System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField"));
  77. }
  78. /**
  79. * 获取属性值
  80. */
  81. @Test
  82. public void testGetFieldValue() {
  83. Object obj = new Son() ;
  84. System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField"));
  85. System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField"));
  86. System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField"));
  87. System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField"));
  88. }
  89. }

spring提供的ReflectionUtils

spring提供的ReflectionUtils可以简化项目中反射代码的复杂性。源码位置:org.springframework.util.ReflectionUtils
在项目中如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题

获取方法

Method method = ReflectUtil.getMethod(obj.getClass(), methodName);

obj 是bean对象,getMethod方法有多个重载,可以声明参数

执行方法

ReflectionUtils.invokeMethod(method, obj, args);

method方法实体,obj bean实体,args参数

mybatisplus提供的ReflectionKit

plus提供的ReflectionUtils可以简化项目中反射代码的复杂性。源码位置:com.baomidou.mybatisplus.toolkit.ReflectionKit

  1. C c = new C();
  2. c.setSex("女");
  3. c.setName("妹纸");
  4. c.setAge(18);
  5. Assertions.assertEquals(c.getSex(), ReflectionKit.getMethodValue(c.getClass(), c, "sex"));
  6. Assertions.assertEquals(c.getAge(), ReflectionKit.getMethodValue(c, "age"));
  7. Map<String, Field> map = ReflectionKit.getFieldMap(c.class)
  8. for (String key: map.keySet()) {
  9. ReflectionKit.getMethodValue(c, key);
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/289124
推荐阅读
相关标签
  

闽ICP备14008679号