需要用到的工具  jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class TestJdkProxy { public interface UserService { public String get…
先在mavne项目里添加cglib库 maven仓库搜索cglib版本 maven地址:http://mvnrepository.com/ 点击最新的版本 3.2.5 复制到pom.xml  dependencies 标签下 <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </d…
QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错 有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类 QSocketException 是通信层出错 凡是来自QSocketException 统一认为非法请求,强制关闭socket连接 QJsonException 是json编解码出错 json很流行种数据格式,跨平台特点,经常处理 QEnhanceException 是Javassist动态生成java class技术,…
由于java是种强类型静态语言,在执行时无法动态生成代码,静态语言基本都有这特性 动态生成代码有几种好处,也是弱类型语言的优点 1.部份逻辑可以实现热更新 2.远程调用实现非常适合 3.能动态生成扩展类,屏蔽复杂性,在原来基础上扩展功能,无破坏源码特性 静态语言也不是没有方案去解决,解决方案很多. 其中嵌入一个脚本引擎语言,就能弥补,还有动态代理技术 jdk 自带的动态代理是一种解决方案 cglib动态代理 spring默认使用 javassit 能在执行期修改class 顺便说下scala语言…
动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预处理.编译处理 6.rpc设计,与实现 7.扫描class 8.系统服务水平扩展支持…
应用动态代理技术要先掌握annotation技术 注解是JDK1.5之后才有的新特性,JDK1.5之后内部提供的三个注解 @Deprecated 意思是“废弃的,过时的” @Override 意思是“重写.覆盖” @SuppressWarnings 意思是“压缩警告” 注解可以加在类名,方法,参数,属性等,为开发者自定义编译处理,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解 所以注解是做框架必备技术 先来看看如何书写Annotation im…
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract class AbstractProcessor implements Processor { protected ProcessingEnvironment processingEnv; public Set<String> getSupportedOptions() { SupportedOpti…
基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</javassist.version> </properties> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <ve…
private static Map<Short, Map<Byte, Method>> RECEIVE_METHOD_INFO = new HashMap<>(); public static <T> T registerReceiveProxy(Object obj) { Class<?> target = obj.getClass(); if (target.isInterface()) { throw new RuntimeExcepti…
根据设计生成两个接口,IRpcSend send方法返回数据要求包装成QResult对象 public interface IRpcSend { public <T> QResult<T> send(byte command, Object... args); } public interface IRpcReceive { public <T> T receive(byte command, Objec[] args); } public interface IRpc…