反射的基本使用

反射作为java的灵魂技术。大概介绍一下反射的基本方法

首先编写两个实体类信息,为继承关系:

public class Reflection extends ReflectionFather{
    //私有
    @DateTimeFormat
    private String str1;
    //受保护的
    protected String str2;
    //公共的
    public String str3;
    //默认
    String str4;
    //动态方法
    private void getStr1(){}
    protected void getStr2(){}
    public void getStr3(){}
    void getStr4(){}
    //静态方法
    private static void getStr11(){}
    protected static void getStr22(){}
    public static void getStr33(){}
    static void getStr44(){}
    //无参构造方法
    public Reflection(){
        System.out.println("无参构造方法");
    }
    //有参构造方法
    public Reflection(String str1, String str2, String str3, String str4) {
        this.str1 = str1;
        this.str2 = str2;
        this.str3 = str3;
        this.str4 = str4;
    }

    public String getStr1(String str1) {
        return str1;
    }

    public String getStr2(String str2) {
        return str2;
    }

    public String getStr3(String str3) {
        return str3;
    }

    public String getStr4(String str4) {
        return str4;
    }

    @Override
    public String toString() {
        return "Reflection{" +
                "str1='" + str1 + '\'' +
                ", str2='" + str2 + '\'' +
                ", str3='" + str3 + '\'' +
                ", str4='" + str4 + '\'' +
                ", str22='" + str22 + '\'' +
                ", str33='" + str33 + '\'' +
                ", str44='" + str44 + '\'' +
                '}';
    }
}
public class ReflectionFather {
    //私有
    @DateTimeFormat
    private String str11;
    //受保护的
    protected String str22;
    //公共的
    public String str33;
    //默认
    String str44;
    //动态方法
    private void getstr11(){}
    protected void getstr22(){}
    public void getstr33(){}
    void getstr44(){}
    //静态方法
    private static void getstr111(){}
    protected static void getstr222(){}
    public static void getstr333(){}
    static void getstr444(){}
    //无参构造方法
    public ReflectionFather(){
        System.out.println("父类无参构造方法");
    }
    //有参构造方法
    public ReflectionFather(String str11, String str22, String str33, String str44) {
        this.str11 = str11;
        this.str22 = str22;
        this.str33 = str33;
        this.str44 = str44;
    }

    public String gettr11(String str11) {
        return str11;
    }

    public String getstr22(String str22) {
        return str22;
    }

    public String getstr33(String str33) {
        return str33;
    }

    public String getstr44(String str44) {
        return str44;
    }

    @Override
    public String toString() {
        return "ReflectionFather{" +
                "str11='" + str11 + '\'' +
                ", str22='" + str22 + '\'' +
                ", str33='" + str33 + '\'' +
                ", str44='" + str44 + '\'' +
                '}';
    }
}

方法:获取类的class对象

/**
 * 获取类的class对象
 * @param className 对象所在完整路径
 * @return
 * @throws ClassNotFoundException
 */
 public static Class<?> getClassObj(String className) throws ClassNotFoundException {
    return Class.forName(className);
}
ReflectionUtil.getClassObj("com.qingnian.spring.reflection.Reflection")
result:class com.qingnian.spring.reflection.Reflection

方法:通过反射获取实例对象(有参,无参)

/**
 * 通过反射获取实例对象
 *
 * @param clazz 类的class对象
 * @param pareTyples 构造函数的参数类型
 * @param pareVaules 构造函数的入参
 * @return
 */
 public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) {
     try {
         Constructor ctor = clazz.getDeclaredConstructor(pareTyples);
         ctor.setAccessible(true);
         return ctor.newInstance(pareVaules);
     } catch (Exception e) {
         e.printStackTrace();
     }

     return null;
 }
Class[] pareTyples=new Class[]{String.class,String.class,String.class,String.class};
Object[] pareVaules=new Object[]{"1","2","3","4"};
Object object2 = ReflectionUtil.createObject(aClass, pareTyples,pareVaules);
result:Reflection{str1='1', str2='2', str3='3', str4='4', str22='null', str33='null', str44='null'}

方法:通过反射调用方法获取返回值

/**
 * 通过反射调用方法获取返回值
 * @param clazz 类的class对象
 * @param method_name 要调取的方法名
 * @param pareTyples 方法参数类型
 * @param pareVaules 方法入参
 * @return
 */
 public static Object invokeMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) {
     try {
         Object o = clazz.getDeclaredConstructor().newInstance();
         Method method = clazz.getDeclaredMethod(method_name, pareTyples);
         method.setAccessible(true);
         return method.invoke(o, pareVaules);
      } catch (Exception e) {
         e.printStackTrace();
      }
         return null;
 }
Class[] pareTyples2=new Class[]{String.class};                     
Object[] pareVaules2=new Object[]{"4-13"};
Object getStr1 = ReflectionUtil.invokeMethod(aClass, "getStr1", pareTyples2, pareVaules2);

方法:获取有指定注解的字段

/**
 *   查询包含指定注解 pareTyple的字段集合
 * @param clazz  类的class对象
 * @param pareTyple
 * @return
 */
 public static Field[] getAnnotationsFields(Class clazz,Class pareTyple){
     //获取所有字段
     Field[] fields = clazz.getDeclaredFields();
     Field[] result=new Field[fields.length];
     for (int i = 0; i < fields.length; i++) {
         //包含指定注解,则在结果集添加此字段
         if (fields[i].isAnnotationPresent(pareTyple)){
             result[i]=fields[i];
         }
     }
     return result;
 }
Class pareTyples3=JacksonInject.class;
Field[] fields1 = ReflectionUtil.getAnnotationsFields(aClass, pareTyples3);
for (Field field : fields1) {
    System.out.println(field);
}
result:
null
protected java.lang.String com.qingnian.spring.reflection.Reflection.str2
null
null
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值