1.什么是反射?
通俗的来说就是,通过java的类名创建Class对象,然后我们可以通过class对象的newInstance的方法获得我们所需要的对象,而且这个过程是在程序运行中创建的,我们可以称之为动态编译,这样很大的提高了代码的灵活性,并降低了代码之前的耦合度。这样我们常见的例子就是Class.forName("JDBC");我想我们在加载jdbc的时候都用过这个方法,这样就是反射,具体的例子这里不在这里复述,本文重点在于如果提供反射效率;
2.我们在反射细节中如果提供反射效率?
因为反射是解析字节编码,所以在动态加载的时候,JVM无法对这些代码进行优化。所以我们能做的就是在代码上做一些改善的优化。
1.不要用getMethods()后再遍历筛选,如果知道方面的名字的情况下,尽量使用直接根据方法名的情况下获取方法getMethos(methodsName);
2.使用缓存保存:
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
Method method = getMethod0(name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
}
return method;
}
private Method getMethod0(String name, Class<?>[] parameterTypes) {
if ((res = searchMethods(privateGetDeclaredMethods(true),
name,
parameterTypes)) != null) {
return res;
}
if (!isInterface()) {
Class<? super T> c = getSuperclass();
if (c != null) {
if ((res = c.getMethod0(name, parameterTypes)) != null) {
return res;
}
}
}
Class<?>[] interfaces = getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
Class<?> c = interfaces[i];
if ((res = c.getMethod0(name, parameterTypes)) != null) {
return res;
}
}
return null;
}
private static Method searchMethods(Method[] methods,
String name,
Class<?>[] parameterTypes)
{
Method res = null;
String internedName = name.intern();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
if (m.getName() == internedName
&& arrayContentsEq(parameterTypes, m.getParameterTypes())
&& (res == null
|| res.getReturnType().isAssignableFrom(m.getReturnType())))
res = m;
}
return (res == null ? res : getReflectionFactory().copyMethod(res));
}
3.使用当前高性能的反射库;