2011-09-18 66 views
-2

我只是想知道是否有某種方法可以使用Java中的反射實際重命名FileOutputStream的方法。我正在上大學的Java編程課,我們剛剛討論了反射如何工作。我們的任務是做一個例子,我選擇通過FileOutputStream來使用它。我到目前爲止這樣的代碼:FileOutputStream反射

import java.io.*; 

FileOutputStream One; 

try { 
    One = new FileOutputStream("Example.txt"); 
} catch (Exception e) { 
    System.err.println("Error! - " + e); 
} 

所以我會做的是重新命名FileOutputStream中來,也許像TickTok,但它會做同樣的功能。然而,我真正堅持的是我如何去做這件事。有誰知道我會怎麼做?

編輯:我的意思是像

One = new FileOutputStream("Example.txt"); 

到:

One = new TickTok("Example.txt"); 
+1

你實際上沒有在你的代碼中使用任何FileOutputStream方法,所以我不確定它是什麼意思來演示。但反射不能重命名方法,不。 –

+3

重命名*什麼*方法?爲了天哪,爲什麼*? –

+0

我的意思是像One = new FileOutputStream(「Example.txt」); to One = new TickTok(「Example.txt」); – moomonkey

回答

1

您不能使用反射重命名方法。如果您有興趣訪問代表FileOutputStream類的方法的Method對象,使用FileOutputStream的類成員訪問將是最容易的。您可以以這種方式訪問​​該對象:

Class<FileOutputStream> fosClass = One.class; //using the reference to 'One' in your provided code. 

從這裏,你可以得到它的方法的使用getMethod(String name, Class<?>... parameterTypes)之一。

例如,爲了獲得FileOutputStreamwrite(byte[])方法,然後你可以稱之爲:

Method writeMethod = fosClass.getMethod(byte[].class); 

該方法然後可以在FileOutputStream任何實例調用(使用invoke法)這樣的:

writeMethod.invoke(One, new byte[]{100,101,102}); 
2

FileOutputStream類,而不是一個方法。無論如何,反思不能用於任何這樣的事情。

Jakob Jenkov's reflection tutorial

Java的反射API的能夠檢查類,接口,字段和方法在運行時,無需在編譯時知道類,方法等的名稱。也可以實例化新對象,調用方法並使用反射來獲取/設置字段值。

如果你想指FileOutputStream爲不同名稱的效果,你可以簡單地繼承了該類,並以super呼叫匹配它的每一個構造函數來 - 然而,這是沒有意義的。

聽起來好像你已經被要求演示反射的用例,所以我的建議是做更多的研究來理解它的用途和功能(通過研究我的意思是閱讀,而不是StackOverflow問題)。

0

您可以通過子分級它使用其他名稱的構造。但是,如果你有充分的理由這麼做,你只能這樣做。我這種情況下,我會記錄你爲什麼這樣做。

class TickTok extends FileInputStream { 
    public TickTok(String filename) { 
     super(filename); 
    } 
} 

它值得記住的是反射允許您檢查和編程方式使用API​​,但添加或更改它。

爲此,您需要使用類似ASM或Compiler API的庫來生成字節碼。