日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

how2java_HOW TO:构造Java类的原型

發布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的how2java_HOW TO:构造Java类的原型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。