Java如果提高反射效率
16lz
2021-01-22
1.什么是反射?
通俗的来说就是,通过java的类名创建Class对象,然后我们可以通过class对象的newInstance的方法获得我们所需要的对象,而且这个过程是在程序运行中创建的,我们可以称之为动态编译,这样很大的提高了代码的灵活性,并降低了代码之前的耦合度。这样我们常见的例子就是Class.forName("JDBC");我想我们在加载jdbc的时候都用过这个方法,这样就是反射,具体的例子这里不在这里复述,本文重点在于如果提供反射效率;
2.我们在反射细节中如果提供反射效率?
因为反射是解析字节编码,所以在动态加载的时候,JVM无法对这些代码进行优化。所以我们能做的就是在代码上做一些改善的优化。
1.不要用getMethods()后再遍历筛选,如果知道方面的名字的情况下,尽量使用直接根据方法名的情况下获取方法getMethos(methodsName);
2.使用缓存保存:
public Method getMethod(String name, Class<?>... parameterTypes)3.使用当前高性能的反射库;
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));
}
更多相关文章
- javaScript函数中执行C#代码中的函数
- 如何将Java中的类型与反射进行比较
- 反编译APK 得到JAVA代码和资源文件源码
- java.io.File vs java.nio.Files这是新代码中的首选?
- 拖动层的javasvript代码 十行代码即可写出兼容版拖动层
- 我无法让这个简单的ajax代码工作
- javascript实现拖动层效果代码(许愿墙)
- 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchroniz
- 在java自动生成hashCode代码问题? 请大神赐教