作用:代理类的关联类,主要做反射调用。
当有一个类,你不确定类里面有什么的时候,有一种技术叫做反射,可以获取类中所有的方法和属性,而这个Method类实例化的对象就是用来接受反射后获取的方法的类
部分源码如下:
这是一个可以动态调用的类
/**
- This class represents a method. Information about the method can be accessed,
- and the method can be invoked dynamically.
*/
通过比对返回一个方法名称
public static final Comparator<Method> ORDER_BY_SIGNATURE = new Comparator<Method>()
提供调用抽象类中的方法
/**
* @hide
*/
public Method(ArtMethod artMethod) {
super(artMethod);
}
ArtMethod getArtMethod() {
return artMethod;
}
public Annotation[] getAnnotations() {
return super.getAnnotations();
}
@Override public int getModifiers() {
return super.getModifiers();
}
public boolean isVarArgs() {
return super.isVarArgs();
}
public boolean isBridge() {
return super.isBridge();
}
@Override public boolean isSynthetic() {
return super.isSynthetic();
}
@Override public String getName() {
return ArtMethod.getMethodName(artMethod);
}
返回一个异常类型的数组 否则返回空
public Class<?>[] getExceptionTypes() {
if (getDeclaringClass().isProxy()) {
return getExceptionTypesNative();
} else {
// TODO: use dex cache to speed looking up class
return AnnotationAccess.getExceptions(this);
}
}
用与符号做什么?
@Override public int hashCode() {
return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
}
如果方法名相同,返回类型是可转让的?
boolean equalNameAndParameters(Method m) {
return getName().equals(m.getName()) &&
ArtMethod.equalMethodParameters(artMethod,m.getParameterTypes());
}
返回一个数组
public Type[] getGenericParameterTypes() {
return Types.getTypeArray(getMethodOrConstructorGenericInfo().genericParameterTypes, false); }
receiver 接收器
args 参数
isAccessible() 是否访问
public Object invoke(Object receiver, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
return invoke(receiver, args, isAccessible());
}
??为什么要做这步
private native Object invoke(Object receiver, Object[] args, boolean accessible)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;