how2java_HOW TO:构造Java类的原型

how2java

在这篇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的Reflections博客上定型Java类 。

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

how2java

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

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

相关文章

【渝粤题库】国家开放大学2021春2410中国古代文学(B)(2)题目

试卷代号&#xff1a;2410 2021年春季学期期末统一考试 中国古代文学(B)(2) 试题&#xff08;开卷&#xff09; 2021年7月 一、填空&#xff08;每空1分&#xff0c;共20分&#xff09; 1.“疏影横斜水清浅&#xff0c;暗香浮动月黄昏”是宋代隐士诗人__________的咏梅绝唱《山…

关于半马尔可夫(semi-markov)的一个形象解释

青蛙在荷叶上跳动&#xff0c;在每个不同的荷叶上表示不同的状态&#xff0c;从一个荷叶跳到另一个荷叶表示状态的转移&#xff0c;该转移过程只依赖于现在所处荷叶&#xff0c;而与以前呆过的荷叶无关&#xff0c;如果只考虑青蛙跳跃的时刻序列&#xff0c;这个过程就是离散时…

【渝粤题库】国家开放大学2021春2502学前儿童发展心理学题目

试卷代号&#xff1a;2502 2021年春季学期期末统一考试 学前儿童发展心理学 试题 2021年7月 一、选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1.学前儿童心理学是研究( )儿童心理发展规律的科学。 A.0-8、9岁 B.0-3岁 C.0-6岁 D.0-13、14岁 2.对一组或一个儿童进…

Java 8 Stream示例

这篇文章将帮助您了解Java 8中一些重要且经常使用的Stream操作&#xff0c;这使您使用Java编程变得容易。 让我们以传统示例为例&#xff0c;“员工和部门”。 public class Employee {private String name;private Integer age;private String city;private Department depa…

随机过程:指数分布、泊松过程、更新过程(renewal process)+大数定律

笔记主要基于中文版《应用随机过程 Introduction to Probability Models 》(Sheldon M. Ross)&#xff0c;只有非常少的一部分是我自己的注解。写这个笔记的目的是自己复习用&#xff0c;阅读需要一定的微积分和概率论基础。本人为初学者&#xff0c;且全部为自学&#xff0c;如…

【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案

试卷代号&#xff1a;2072 2 0 2 1年春季学期期末统一考试 人文社会科学基础(A) 试题答案及评分标准&#xff08;开卷&#xff09; &#xff08;供参考&#xff09; 2021年7月 一、名词解释&#xff08;共3道题&#xff0c;每题10分&#xff0c;共30分&#xff09; 1&#xff0…

接受拒绝采样(Acceptance-Rejection Sampling)

我们所说的抽样&#xff0c;其实是指从一个概率分布中生成观察值&#xff08;observations&#xff09;的方法。而这个分布通常是由其概率密度函数&#xff08;PDF&#xff09;来表示的。而且&#xff0c; 即使在已知PDF的情况下&#xff0c;让计算机自动生成观测值也不是一件容…

gradle文件不识别_识别Gradle约定

gradle文件不识别通过约定进行配置具有许多优点&#xff0c;尤其是在简洁方面&#xff0c;因为开发人员不需要显式配置通过约定隐式配置的内容。 但是&#xff0c;在利用约定进行配置时&#xff0c;需要注意这些约定。 这些约定可能已记录在案&#xff0c;但是当我可以编程方式…

Telesat、OneWeb及SpaceX三个全球宽带低轨卫星星座系统的技术对比

编者按&#xff1a;本文来自微信公众号“卫星与网络”&#xff08;ID&#xff1a;satnetdy&#xff09;&#xff0c;作者Inigo del Portilloa,*, Bruce G. Cameronb, Edward F. Crawleyc&#xff0c;编译 刘帅军、胡月梅&#xff08;中科院软件所&#xff09;&#xff0c;36氪经…

腾讯人均每月薪酬成本超8万元,员工总数首次超10万

11月10日&#xff0c;腾讯在23岁“生日”即将到来之际发布2021年第三季度业绩报告。财报显示&#xff0c;第三季度腾讯总收入为人民币1424亿元&#xff08;220亿美元 &#xff09;&#xff0c;同比增长13%&#xff1b;净利润(Non-IFRS&#xff09;317.5亿元&#xff0c;同比减少…

Spring State Machine:它是什么,您需要它吗?

状态机是基于有限状态的计算模型 &#xff0c;正如Wikipedia非常明确地说的那样。 通常&#xff0c;工作流会与状态一起使用&#xff0c;这意味着您不能仅从任何状态进入任何其他状态&#xff1a;应遵循一些规则。 这些状态之间的转换受规则限制。 Spring框架具有一个称为Spri…

【渝粤题库】国家开放大学2021春2097民法学(1)题目

试卷代号&#xff1a;2097 2021年春季学期期末统一考试 民法学(1) 试题 2021年7月 一、单项选择题&#xff08;每小题有四个备选答案&#xff0c;有一个正确的&#xff0c;请将正确答案的序号填在题干的括号内。每小题3分&#xff0c;共15分&#xff09; 1.我国法律规定&#x…

信关站、关口站、earth station、gatway

卫星通信系统上行站一般建设在电信港里&#xff08;teleport&#xff09;里&#xff0c;这种上行站规模庞大&#xff0c;一般称为earth station&#xff0c;他是通过SCPC, VSAT或者MESH等多种卫星通讯系统为用户提供服务的核心站点&#xff0c;一般我们称为主站。远端用户使用的…

【渝粤题库】国家开放大学2021春2542行政组织学题目

试卷代号&#xff1a;2542 2021年春季学期期末统一考试 行政组织学试题 2021年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共10分&#xff0c;每小题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1.规范而言&#xff0c;行政组织是追求( )…

低轨卫星通信系统发展综述

最近几年低轨移动通信领域风起云涌&#xff0c;Iridium、OneWeb、Boeing、SpaceX 这些商业航天的 独角兽 都先后实施或宣布自己在这一领域雄心勃勃的计划。 通信、导航和遥感是卫星应用领域的三驾马车&#xff0c;简称 通导遥。鉴于任务特性&#xff0c;通信卫星和导航卫星通常…

【渝粤题库】国家开放大学2021春1425调剂学(本)题目

试卷代号&#xff1a;1425 2021年春季学期期末统一考试 调剂学&#xff08;本&#xff09; 试题 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共60分&#xff09; 1.以下名词的英文缩写不正确的是&#xff08; &#xff09;。 A.世界卫生组织WHO B.中国药学会医院…

【渝粤题库】国家开放大学2021春2109刑事诉讼法学题目

试卷代号&#xff1a;2109 2021年春季学期期末统一考试 刑事诉讼法学 试题 2021年7月 一、单项选择题&#xff08;每题1分&#xff0c;共10分&#xff0c;每题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1_在我国刑事诉讼中&#xff0c;犯罪嫌疑人…

【渝粤题库】国家开放大学2021春2180办公室管理题目

试卷代号&#xff1a;2180 2021年春季学期期末统一考试 办公室管理 试题 2021年7月 一、单项选择题&#xff08;请将正确答案的字母序号填在括号内&#xff0c;每小题3分&#xff0c;共15分&#xff09; 1.加强对办公用品的库存控制与监督&#xff0c;要求保证进货卡、库存卡和…

java运行时参数_运行时的Java 8参数名称

java运行时参数Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称。 在Java 8之前&#xff0c;找到参数名称的方法是在编译阶段打开调试符号&#xff0c;这会在生成的类文件中添加有关参数名称的元信息&#xff0c;然后提取复杂的信息&#xff0c;需要处理字节码。…

天地一体化信息网络发展与拟态技术应用构想

天地一体化信息网络发展与拟态技术应用构想 2019-07-20 08:00 作者: 梁浩, 陈福才, 季新生, 吕平, 高彦钊 国家数字交换系统工程技术研究中心 摘要: 天地一体化信息网络是国家面向2030的重大科技工程, 现有的基础架构及由此构建的技术体系在其节点高性能处理、网络高效互联…