Java中的@interface以及method.invoke()

本文介绍了Java中的注解和反射,通过实例演示了method.invoke()的使用,讨论了注解的元注解,包括Retention Policy的三种策略,并展示了如何在代码中定义和应用注解。
摘要由CSDN通过智能技术生成

前言

  这几天在看暑假要去实习的公司的框架源码,该框架十分轻量级,上手贼快。
  Web容器是Jetty,数据库是MySQL,使用该框架形式为插件开发,只需要按照该框架可以识别的规则开发,再将项目放到指定目录下,服务启动后加载该目录下的所有插件,用反射进行方法调用(几乎所有的框架底层都是用反射的吧)。
  看了一天过后对框架整体有了一定了解,但是之前自己没有写过相关的代码,因此写了几个小demo进行测试,今天谈一谈Java中的注解和反射。

method.invoke()

  反射的概念不再赘述,直接来说method.invoke()的使用。
  查看源代码如下:

@CallerSensitive
public Object invoke(Object obj, Object... args) 
    throws IllegalAccessException, IllegalArgumentException,
       InvocationTargetException { // Object...表示参数为0到多个
    if (!override) {
        if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
            Class<?> caller = Reflection.getCallerClass();
            checkAccess(caller, clazz, obj, modifiers);
        }
    }
    MethodAccessor ma = methodAccessor;             // read volatile
    if (ma == null) {
        ma = acquireMethodAccessor();
    }
    return ma.invoke(obj, args);
}

  不深究源代码的意义,我们只来看参数,obj是该方法对应的类的对象,如果该方法是一个静态方法,obj参数可以为nullargs为该方法需要传入的参数,这里Object...表示参数为0到多个。如果要调用的方法没有参数,就传入参数。如果方法是void方法,那么返回null;如果方法返回类型是基本类型,返回基本类型的包装类。
  接下来来看demo:

Demo

测试的类为:

public class InvokeObject {

    public InvokeObject() {
        System.out.println("这是构造方法");
    }

    public void print() {
        System.out.println("这是无参方法");
    }

    public void print(String str) {
        System.out.println("这是有一个参数的方法,传入的参数为:" + str);
    }

    public void print(String str1, String str2) {
        System.out.println("这是有一个参数的方法,传入的参数str1为:" + str1 + ",str2为:" + str2);
    }
}

  测试方法为:

import java.lang.reflect.Method;

public class Main {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) throws Exception {

        Class<InvokeObject> clazz = InvokeObject.class;
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            // 方法的返回值类型
            Class returnType = method.getReturnType();
            System.out.print(returnType.getName() + " ");
            // 方法的名字
            System.out.print(method.getName() + " (")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值