前言
这几天在看暑假要去实习的公司的框架源码,该框架十分轻量级,上手贼快。
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
参数可以为null
;args
为该方法需要传入的参数,这里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() + " (")