当前位置: 首页 > news >正文

可以让外国人做问卷调查的网站云南工程建设总承包公司网站

可以让外国人做问卷调查的网站,云南工程建设总承包公司网站,大连全员核酸检测,副业做网站软件不太经常#xff0c;但有时我们被迫使用java.lang.reflect.Proxy编写自定义动态代理类 。 这种机制的确没有魔力#xff0c;而且即使您永远不会真正使用它#xff0c;也值得知道-因为Java代理在各种框架和库中无处不在。 这个想法很简单#xff1a;动态创建一个实现一个或… 不太经常但有时我们被迫使用java.lang.reflect.Proxy编写自定义动态代理类 。 这种机制的确没有魔力而且即使您永远不会真正使用它也值得知道-因为Java代理在各种框架和库中无处不在。 这个想法很简单动态创建一个实现一个或多个接口的对象但是每次调用这些接口的任何方法时都会调用我们的自定义回调处理程序。 该处理程序接收到一个被称为 java.lang.reflect.Method实例方法的句柄并且可以以任何方式自由运行。 代理通常用于实现无缝的模拟缓存事务和安全性即它们是AOP的基础。 在我从标题解释com.google.common.reflect.AbstractInvocationHandler的目的之前让我们从一个简单的示例开始。 假设我们要在线程池中透明地异步运行给定接口的方法。 诸如Spring请参阅 27.4.3 The Async Annotation 和Java EE请参阅 Asynchronous Method Invocation 之类的流行堆栈已经使用相同的技术来支持此功能。 假设我们提供以下服务 public interface MailServer {void send(String msg);int unreadCount(); } 我们的目标是异步运行send()以便几个后续调用不会阻塞而是排队并在外部线程池中同时执行而不是在调用线程中执行。 首先我们需要将创建代理实例的工厂代码 public class AsyncProxy {public static T T wrap(T underlying, ExecutorService pool) {final ClassLoader classLoader underlying.getClass().getClassLoader();final ClassT intf (ClassT) underlying.getClass().getInterfaces()[0];return (T)Proxy.newProxyInstance(classLoader,new Class?[] {intf},new AsyncHandlerT(underlying, pool));} } 上面的代码很少做出大胆的假设例如一个underlying对象我们正在代理的实际实例恰好实现了一个接口。 在现实生活中一门课程当然可以实现多个接口代理也可以实现多个接口但是出于教育目的我们对此进行了一些简化。 现在对于初学者我们将创建无操作代理该代理将委托给基础对象而没有任何附加值 class AsyncHandlerT implements InvocationHandler {private static final Logger log LoggerFactory.getLogger(AsyncHandler.class);private final T underlying;private final ExecutorService pool;AsyncHandler1(T underlying, ExecutorService pool) {this.underlying underlying;this.pool pool;}Overridepublic Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {return method.invoke(underlying, args);}} ExecutorService pool将在以后使用。 最后一行至关重要–我们在具有相同args underlying实例上调用method 。 在这一点上我们可以 是否调用underlying 例如如果给定的呼叫被缓存/存储 更改参数即出于安全目的 在异常之前/之后/周围/上运行代码 通过返回不同的值来改变结果它必须与method.getReturnType()的类型匹配 …以及更多 在我们的例子中我们将method.invoke()与Callable一起Callable并异步运行 class AsyncHandlerT implements InvocationHandler {private final T underlying;private final ExecutorService pool;AsyncHandler(T underlying, ExecutorService pool) {this.underlying underlying;this.pool pool;}Overridepublic Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {final FutureObject future pool.submit(new CallableObject() {Overridepublic Object call() throws Exception {return method.invoke(underlying, args);}});return handleResult(method, future);}private Object handleResult(Method method, FutureObject future) throws Throwable {if (method.getReturnType() void.class)return null;try {return future.get();} catch (ExecutionException e) {throw e.getCause();}} } 提取了额外的handleResult()方法以正确处理非void方法。 使用这样的代理很简单 final MailServer mailServer new RealMailServer();final ExecutorService pool Executors.newFixedThreadPool(10); final MailServer asyncMailServer AsyncProxy.wrap(mailServer, pool); 现在即使RealMailServer.send()花费一秒钟完成通过asyncMailServer.send()调用两次也asyncMailServer.send()花费时间因为这两个调用都是在后台异步运行的。 损坏的 一些开发人员不了解默认InvocationHandler实现的潜在问题。 引用官方文件 如上所述将对代理实例上java.lang.Object声明的hashCode equals或toString方法的调用进行编码并分派给调用处理程序的invoke方法就像对接口方法调用进行编码和分派一样。 在我们的案例中这意味着例如toString()与MailServer其他方法在同一线程池中执行这非常令人惊讶。 现在假设您有一个本地代理其中每个方法调用都会触发远程调用。 通过网络调度equals() hashCode()和toString()绝对不是我们想要的。 用 Guava的AbstractInvocationHandler是一个简单的抽象类可以正确处理上述问题。 默认情况下它将equals() hashCode()和toString()调度到Object类而不是将其传递给调用处理程序。 从直接的InvocationHandler重构为AbstractInvocationHandler非常简单 import com.google.common.reflect.AbstractInvocationHandler;class AsyncHandlerT extends AbstractInvocationHandler {//...Overrideprotected Object handleInvocation(Object proxy, final Method method, final Object[] args) throws Throwable {//...}Overridepublic String toString() {return Proxy of underlying;} } 而已 我决定重写toString()来帮助调试。 equals()和hashCode()都是从Object继承而来的一开始就很好。 现在请查看您的代码库并搜索自定义代理。 如果到目前为止您还没有使用AbstractInvocationHandler或类似的东西很可能会引入一些细微的错误。 参考 Java和社区博客上的Java 合作伙伴 Tomasz Nurkiewicz 使用Guava的AbstractInvocationHandler正确完成了代理 。 翻译自: https://www.javacodegeeks.com/2013/12/proxies-done-right-with-guavas-abstractinvocationhandler.html
http://www.huolong8.cn/news/457228/

相关文章:

  • 网站建设icp备案跨境电商排名前十名品牌
  • 深圳制作企业网站的公司免费源码下载网站
  • 装修网站建设怎么在一个网站做多个页面
  • 提供图片做网站的要求移动端网站开发技术
  • 欣宝儿在什么网站做直播电子商务公司招聘
  • 织梦网站怎么做安全措施信誉好的网站开发
  • 网站可以做动态背景吗wordpress调用指定文章图片
  • 国外 电子 商务 网站 欣赏国外炫酷网站设计
  • 阿里巴巴网站建设过程川渝建设集团网站
  • WordPress插件框架苏州优化网站
  • 江苏网站设计方案赣州网站建设方案
  • 花店网站建设论文软件商店oppo版本最新版
  • 广州网站建设天维智慧团建系统平台登录入口
  • 万网主机怎么上传网站酒店网站建设报价单
  • 微信网站开发哪家好下载软件商店app
  • 柳州企业网站制作哪家好网络平台有哪些类型
  • 抚顺建设银行网站站内搜索本网站怎么做
  • 手机网站关键长沙楼市最新消息
  • 做电子外贸网站建设上海公司招聘信息查询
  • 网站建设服务开税率多少的票小榄网站开发
  • 湖北网站科技建设discuz 企业网站
  • 网站建设与设计主要是干什么的wordpress 图片预加载
  • 网站实名审核中心类似wordpress的网站
  • jsp租房网站开发微信开放平台怎么注册
  • 怎么做物物交换网站网站推广适合哪种公司做
  • 有哪些做兼职的设计网站有哪些凡科建站电脑版网址
  • 做视频包的网站旅游最新消息
  • 旅游网站模板源码专业嵌入式软件开发
  • 山东兴宇建设工程网站展示型企业网站制作费用
  • 网站专题教程机械毕业设计代做网站推荐