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

歡迎訪問 默认站点!

默认站点

當(dāng)前位置: 首頁 >

HOW TO:构造Java类

發(fā)布時間:2023/12/3 25 豆豆
默认站点 收集整理的這篇文章主要介紹了 HOW TO:构造Java类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在這篇HowTo帖子中,我將展示如何將一個類與另一個類一起定型。 為什么這有用?

  • 當(dāng)您的項目中發(fā)生大量BCI時,讓每個開發(fā)人員編寫B(tài)CI代碼都是不明智的。
    • 首先,這不會抽象出所使用的BCI庫。
  • 鑒于Java不支持多重繼承,構(gòu)造型可用于實現(xiàn)多重繼承而無需委派。 在此處查看多個繼承選項。
  • 存在諸如配置文件之類的代碼方面,僅在測試代碼時才需要提供。 生產(chǎn)代碼最好不要被調(diào)試代碼所困擾。 在這種情況下,可以通過完全改變用于加載類的類加載器來使用構(gòu)造型,一種添加配置文件代碼,另一種不添加配置文件代碼。

立體打字意味著……

假設(shè)有一個界面:

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

您為此接口編寫一個實現(xiàn):

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;} }

您希望所有需要實現(xiàn)該接口的類都使用上述實現(xiàn),而無需開發(fā)人員對其進(jìn)行實際編碼。 在運(yùn)行時,您希望類適應(yīng)這種行為。 例如,您要將一個類編碼為:

public class ClassToStereoType {..... }

哪個沒有實現(xiàn)PerfInterface。 但是,為了提高性能而運(yùn)行它時,您希望該類為:

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

實現(xiàn)了PerfInterface的所有功能。 這稱為定型。

如何定型?

在這里,我們將使用asm庫進(jìn)行原型化。 我們將遵循與“ 運(yùn)行時BCI ”中相同的步驟。 我們將從必須刻板印象的類中創(chuàng)建一個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中,該類節(jié)點(diǎn)現(xiàn)在包含PerfTemplate類中的所有字段和方法。

我們將編寫一個重寫visitEnd的ClassVisitor,以從創(chuàng)建的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)中。 添加方法時,應(yīng)注意確保將對PerfTemplate類的所有引用都修改為ClassToStereoType。 為此,我們使用RemappingMethodAdapter,它是asm提供的類。

為了將接口從PerfTemplate添加到ClassToStereoType,我們重寫了visit方法。 在這里,我們將接口從ClassNode添加到當(dāng)前類。

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;}

在上面的代碼中,我們將通過調(diào)用_cn.interfaces獲得的來自ClassNode的所有接口附加到ClassToStereoType的接口。 我們使用此接口的修改列表訪問該類。 這樣可以確保在已加載的類中實現(xiàn)接口。

現(xiàn)在,通過這些更改實現(xiàn)的ClassVisitor可用于修改類加載器中的字節(jié)以構(gòu)造類。

該HOWTO的代碼可以在這里找到。 運(yùn)行compiletst.sh中的命令以嘗試示例。

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

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

總結(jié)

以上是默认站点為你收集整理的HOW TO:构造Java类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網(wǎng)站內(nèi)容還不錯,歡迎將默认站点推薦給好友。