HOW TO:构造Java类

在这篇HowTo帖子中,我将展示如何将一个类与另一个类一起定型。 为什么这有用?

  • 当您的项目中发生大量BCI时,让每个开发人员编写BCI代码都是不明智的。
    • 首先,这不会抽象出所使用的BCI库。
  • 鉴于Java不支持多重继承,构造型可用于实现多重继承而无需委派。 在此处查看多个继承选项。
  • 存在诸如配置文件之类的代码方面,仅在测试代码时才需要提供。 生产代码最好不要被调试代码所困扰。 在这种情况下,可以通过完全改变用于加载类的类加载器来使用构造型,一种添加配置文件代码,另一种不添加配置文件代码。

立体打字意味着……

假设有一个界面:

public interface PerfInterface
{public void start(String nm);public void end();public String getValue(String value);
}

您为此接口编写一个实现:

import java.util.Stack;public class PerfTemplate implements PerfInterface
{private Stack _stats;public void start(String nm){PerfStats stat = new PerfStats();stat.start(nm);if (_stats == null)_stats = new Stack();_stats.push(stat);}public void end(){try{PerfStats stat = (PerfStats)_stats.pop();stat.end();}catch (Exception e){e.printStackTrace();}}public String getValue(String val){return "PerfTemplate:Modified:" + val;}
}

您希望所有需要实现该接口的类都使用上述实现,而无需开发人员对其进行实际编码。 在运行时,您希望类适应这种行为。 例如,您要将一个类编码为:

public class ClassToStereoType
{.....
}

哪个没有实现PerfInterface。 但是,为了提高性能而运行它时,您希望该类为:

public class ClassToStereoType implements PerfInterface
{.....
}

实现了PerfInterface的所有功能。 这称为定型。

如何定型?

在这里,我们将使用asm库进行原型化。 我们将遵循与“ 运行时BCI ”中相同的步骤。 我们将从必须刻板印象的类中创建一个ClassNode对象,如下所示:

InputStream nstr = new FileInputStream("PerfTemplate.class");ClassReader n = new ClassReader(nstr);ClassNode cn = new ClassNode();n.accept(cn, ClassReader.EXPAND_FRAMES);

在这里,我们阅读PerfTemplate.class类,并将其接受到ClassNode中,该类节点现在包含PerfTemplate类中的所有字段和方法。

我们将编写一个重写visitEnd的ClassVisitor,以从创建的ClassNode中添加字段和方法。

public void visitEnd(){System.out.println("In visit End. Adding Fields");for (Iterator it = _cn.fields.iterator(); it.hasNext();){((FieldNode) it.next()).accept(cv);}for(Iterator it = _cn.methods.iterator(); it.hasNext();){MethodNode mn = (MethodNode) it.next();if (!mn.name.equals("")) //ignore constructor{String[] exceptions = new String[mn.exceptions.size()];mn.exceptions.toArray(exceptions);MethodVisitor mv = cv.visitMethod( mn.access, mn.name, mn.desc, mn.signature, exceptions);mn.instructions.resetLabels();mn.accept(new RemappingMethodAdapter( mn.access, mn.desc, mv, new SimpleRemapper(_cn.name, _name)));}}            super.visitEnd();}

在上面的代码中,我们遍历字段并将其添加到我们正在修改的类(即ClassToStereoType)中。 添加方法时,应注意确保将对PerfTemplate类的所有引用都修改为ClassToStereoType。 为此,我们使用RemappingMethodAdapter,它是asm提供的类。

为了将接口从PerfTemplate添加到ClassToStereoType,我们重写了visit方法。 在这里,我们将接口从ClassNode添加到当前类。

public void visit (int version, int access, String name, String signature, String superName, String[] interfaces){System.out.println("Class Name is: " + name + ":" + signature + ":" + superName);int len = 0;List ndeints = _cn.interfaces;if (interfaces != null) len = interfaces.length;String[] modinterfaces = new String[len + ndeints.size()];int cnt = 0;for (cnt = 0; (interfaces != null) && ( cnt < interfaces.length); cnt++){modinterfaces[cnt] = interfaces[cnt];}for (String inter : ndeints)modinterfaces[cnt++] = inter;cv.visit(version, Opcodes.ACC_PUBLIC, name, signature, superName, modinterfaces);_name = name;}

在上面的代码中,我们将通过调用_cn.interfaces获得的来自ClassNode的所有接口附加到ClassToStereoType的接口。 我们使用此接口的修改列表访问该类。 这样可以确保在已加载的类中实现接口。

现在,通过这些更改实现的ClassVisitor可用于修改类加载器中的字节以构造类。

该HOWTO的代码可以在这里找到。 运行compiletst.sh中的命令以尝试示例。

参考:操作方法 :在我们的JCG合作伙伴 Raji Sankar的反射博客上定型Java类 。

翻译自: https://www.javacodegeeks.com/2013/11/how-to-stereotyping-a-java-class.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android horizontalscrollview 动画,Android HorizontalScrollView左右滑动效果

本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图一.什么是HorizontalScrollViewHorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 &#xff0c;这个子控件可以包…

[译] Airbnb 在 React Native 上下的赌注(一):概述

原文地址&#xff1a;React Native at Airbnb原文作者&#xff1a;Gabriel Peal译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;https://github.com/xitu/gold-miner/blob/master/TODO1/react-native-at-airbnb.md译者&#xff1a;ALVINYEH校对者&#xff1a;ChenDo…

noip退役之路--祝福

原文地址&#xff1a;bb机的老巢 文/鲁迅 noip前的集训毕竟最像集训&#xff0c;去北京不必说&#xff0c;就在自己学校的机房中也显出将到noip的气象来。屏幕广播里讲解的题目闪着斑白的微光&#xff0c;随着鼠标叩击“提交”按钮的一声钝响&#xff0c;是直播ac后的欢呼&…

批处理最佳做法

大多数应用程序至少具有一个批处理任务&#xff0c;在后台执行特定的逻辑。 编写批处理作业并不复杂&#xff0c;但是您需要了解一些基本规则&#xff0c;我将列举一些我发现最重要的规则。 从输入类型的角度来看&#xff0c;处理项目可以通过轮询处理项目存储库来实现&#x…

android 360度视频播放器,Android开发VR实战之播放360度全景视频

VR即Virtual Reality虚拟现实。虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中。那么&#xff0c;如何在Android中去开发VR功能的APP呢&#xff1f…

关于怎么在手机端实现一个拖拽的操作

手机端&#xff0c;肯定是监听touchstart,touchmove,touchend事件 先来看看效果 当拖拽时&#xff0c;拖拽到哪个节点下面&#xff0c;就把哪个节点添加到这个下面 <div>1111</div><div>2222</div><div>3333</div><div>4444</div…

二叉树的前序创建

1 #include <stdio.h>2 #define ElemType char3 //节点声明&#xff0c;数据域、左孩子指针、右孩子指针4 typedef struct BiTNode{5 char data;6 struct BiTNode *lchild,*rchild;7 }BiTNode,*BiTree;8 //先序建立二叉树9 BiTree CreateBiTree(){ 10 char c…

Apache Karaf遇到Apache HBase

介绍 Apache HBase是模仿Google Bigtable的开源&#xff0c;分布式&#xff0c;版本化&#xff0c;面向列的商店。 如果您是普通读者&#xff0c;那么您可能已经知道Apache Karaf是什么&#xff0c;但是对于那些不是的读者&#xff1a;Apache Karaf是一个OSGi运行时&#xff0c…

物联网架构成长之路(24)-Docker练习之Compose容器编排

0.前言  一开始学的之后&#xff0c;是想一步到位直接上Kubernetes(K8s)的&#xff0c;后面没想到&#xff0c;好像有点复杂&#xff0c;有些概念不是很懂。因此学习东西还是要循序渐进&#xff0c;慢慢来。先了解单机编排技术Docker Compose&#xff0c;了解一些技术细节及原…

CSS原理解析之模型篇

写在前面&#xff1a;尝试回答几个问题&#xff1a;什么是盒模型&#xff0c;控制盒模型的属性有哪些&#xff1f;Margin、Padding、Border、Width、Height这些属性改变/影响盒模型&#xff0c;但每个属性都会在所有元素上生效么&#xff1f;如果存在区别&#xff0c;那么和元素…

Quartz遇到的问题

本文首次发布于My Blog,作者张琦(Ian),转载请保留原文链接。 有状态和无状态 使用有状态&#xff08;StatefulJob&#xff09;还是无状态的任务&#xff08;Job&#xff09; 在 Quartz 中&#xff0c;基本来说&#xff0c;任务分为有状态和无状态两种。实现 Job 接口的任务缺省…

android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称&#xff0c;希望本文对大家学Android有所帮助。<在BaseActivity的onCreate方法中:public class BaseActivity extends AppCompatActivity { Override protected void onCreate(Nul…

RIP RETE时间获得PHREAKY

我刚刚完成了我称为PHREAK的新规则算法的一些高级文档&#xff0c;这是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平&#xff0c;但希望仍然很有趣。 它建立在ReteOO之上&#xff0c;非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用RETE算法并应…

Hadoop自学笔记(三)MapReduce简单介绍

1. MapReduce Architecture MapReduce是一套可编程的框架&#xff0c;大部分MapReduce的工作都能够用Pig或者Hive完毕。可是还是要了解MapReduce本身是怎样工作的&#xff0c;由于这才是Hadoop的核心&#xff0c;而且能够为以后优化和自己写做准备。 Job Client, 就是用户 Job …

洛谷 P2051 [AHOI2009]中国象棋 解题报告

P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关&#xff0c;在一个N行M列的棋盘上&#xff0c;让你放若干个炮&#xff08;可以是0个&#xff09;&#xff0c;使得没有一个炮可以攻击到另一个炮&#xff0c;请问有多少种放置方法。大家肯定很清楚&am…

VirtualDOM与diff(Vue实现)

写在前面 因为对Vue.js很感兴趣&#xff0c;而且平时工作的技术栈也是Vue.js&#xff0c;这几个月花了些时间研究学习了一下Vue.js源码&#xff0c;并做了总结与输出。文章的原地址&#xff1a;https://github.com/answershuto/learnVue。在学习过程中&#xff0c;为Vue加上了…

使用Java的RESTful Web服务

REST代表“代表性状态转移”&#xff0c;由Roy Fielding于2000年在其论文“建筑风格和基于网络的软件体系结构设计”中首次提出。 REST是一种建筑风格。 HTTP是一种协议&#xff0c;其中包含一组REST体系结构约束。 REST基础 REST中的所有内容都被视为资源。 每个资源都由UR…

android 基础应用程序,android应用程序基本实现(基础篇).ppt

《android应用程序基本实现(基础篇).ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《android应用程序基本实现(基础篇).ppt(22页珍藏版)》请在人人文库网上搜索。1、Android应用程序基本实现,复杂的应用,上节课&#xff0c;我们实现了一个基本的android的应用程序…

windows npm安装webpack

Webpack: Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。 参考下图&#xff1a; 安装Webpack: 1.首先需要安装node.js&#xff08;npm&#xff09; 下载地址&#xff1a;node.js dow…

ThreadLocal如何实现?

这是我上周的帖子的后续文章&#xff0c;在那篇文章中我解释了ThreadLocal用法的动机 。 从帖子中我们可以回想起&#xff0c;如果您希望每个线程都有一个独立初始化的变量副本&#xff0c;则ThreadLocal确实是一个很酷的概念。 现在&#xff0c;好奇的人可能已经开始问“我如何…