package test; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedHashMa…
Android高效率编码-findViewById()的蜕变-注解,泛型,反射 Android的老朋友findViewById()篇! 先看看他每天是在干什么 //好吧,很多重复的,只不过想表达项目里确实有很多控件 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.laft_drawer); mDrawerLayout = (Dra…
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Proxy)和具体主题角色(Real Subject)共同实现主题角色(Subject)的逻辑的,只是代理角色把相关的执行逻辑委托给了具体角色而已,一个简单的静态代理如下所示: interface Subject { // 定义一个方法 public void request(); } // 具体主题角色…
反射是一种很重要的技术,然而它与直接调用相比性能要慢很多,因此如何优化反射性能也就成为一个不得不面对的问题. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性.字段). 目前最常见也就是二种方法:Emit, ExpressionTree .其中ExpressionTree可认为是Emit方法的简化版本, 所以Emit是最根本的方法,它采用在运行时动态构造一段IL代码来包装需要反射调用的代码, 这段动态生成的代码满足某个委托的签名,因此最后可以采用委托的方式…
阅读目录 开始 用Delegate优化反射的缺点 用Delegate优化反射的优点 用CodeDOM优化反射的优点 如何用好CodeDOM? 用CodeDOM优化反射的缺点 能不能不使用委托? 根据反射密集程度选择优化方法 CodeDOM优化的误区 反射优化的总结 在前二篇博客中,我分别介绍了二种优化反射的方法: 1. Delegate:委托. 2. CodeDOM:动态代码生成. 这是二种截然不同的方法,性能的差距也很大. 今天的博客将着重比较它们的优缺点,以及给出它们的使用建议. 回到顶部…
问题回顾 在上篇博客中,我介绍了优化反射的第一个步骤:用委托调用代替直接反射调用. 然而,那只是反射优化过程的开始,因为新的问题出现了:如何保存大量的委托? 如果我们将委托保存在字典集合中,会发现这种设计会浪费较多的执行时间,因为这种设计会引发三个新问题: 1. 代码的执行路径变长了. 2. 字典查找是有成本开销的. 3. 字典集合的并发读写需要锁定,会影响并发性. 再来回顾一下上次的测试结果吧: 虽然通用接口ISetValue将反射性能优化了37倍,但是最终的FastSetValue将这个数字…
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotation是从JDK5.0开始引入的新技术 . Annotation的作用 : 不是程序本身 , 可以对程序作出解释.(这一点和注释没什么区别) 可以被其他程序(比如:编译器等)读取.(注解信息处理流程,是注解和注释的重大区别.如果没有注解信息处理流程,则注解毫无意义) Annotation的格式 :…
写在前面 1)本篇博客并非原创,而是我针对.NET反射相关知识的总结.本篇内容来源汇总于3篇博客.在后面的介绍中会在开头给出对应的链接,方便读者自行学习.2)本篇博客主要针对表达式树代码进行详细讲解. 反射优化简介 我们知道反射与直接调用相比性能要慢很多,因此本篇主要针对如何对反射进行优化. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性.字段). 那么如何得到委托? 三种方法:Emit.Delegate.CreateDelegate.Expressio…
通过泛型与反射的结合,可以编写框架来使开发更容易,这里演示的是BaseDao部分的简单使用. BaseDao部分代码: public abstract class BaseDao<T>{ private Class clazz;//具体的实体类 public BaseDao(){ //必须知道具体操作的哪个类,给clazz赋值 Type type = this.getClass().getGenericSuperclass();//得到当前对象的带有泛型信息的父类型 如:BaseDao<…
什么是枚举类? 枚举类是优化定义固定对象的一种特殊的类. 换句话说,在需要类的实例为一个或者多个并且相对固定的时候,使用枚举类.(枚举类可扩展) 类的实例相对来说固定的有日期,客观不变的一些数字等等. enum WorkDay { MONDAY, THUEDAY, WEDNESDAY , THURSDAY , FRIDAY; } public class Main { public static void main(String[] args) { System.out.println("Hel…