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中的命令以嘗試示例。
翻譯自: https://www.javacodegeeks.com/2013/11/how-to-stereotyping-a-java-class.html
how2java
總結
以上是生活随笔為你收集整理的how2java_HOW TO:构造Java类的原型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在STS中创建Spring Boot
- 下一篇: 苹果怎么屏蔽垃圾信息骚扰