2012-02-25 73 views
0

javax.swing.text.html.ImageView; 線111和258-267
http://javasourcecode.org/html/open-source/jdk/jdk-6u23/javax/swing/text/html/ImageView.java.html訪問Java的私有字段

public class ImageView extends View { 
    .... 
    private float vAlign; 
    .... 
} 

我的程序:

..... 
ImageView layeredPane = (ImageView) view; 
Field privateStringField = layeredPane.getClass().getDeclaredField("vAlign"); 
privateStringField.setAccessible(true); 
layeredPane.vAlign = 2.0; 
..... 

我得到:

Test.java:80: error: vAlign has private access in ImageView layeredPane.vAlign = 2.0;

如何解決呢?我需要將值設爲2.0

回答

6

您可以通過不嘗試獲取私有實現詳細信息來修復它。基本上你不應該這樣做。即使您仍在使用此版本的ImageView,您的代碼也會變得很脆弱,並且易受版本之間的更改影響。它的全部重點是停止你直接訪問它。

可以下降privateStringField.setFloat(layeredPane, 2.0f),但我會強烈反對建議。

(很奇怪稱之爲privateStringField當它是一個浮動場,順便......)

+0

java.lang.IllegalAccessException:類不能訪問修飾符類javax.swing.text.html.ImageView中的一員「私人」我明白,這是不好,但這是非常有必要的。也許有一種方法可以添加我自己的方法,或修改protected void setPropertiesFromAttributes? – user1221483 2012-02-25 20:12:25

+0

@ user1221483:你調用'setAccessible(true)'後會得到那個*嗎?我不相信它*是必要的 - 它真的感覺像你應該嘗試以不同的方式通過更多的佈局來實現。 – 2012-02-25 20:45:13

+0

pardon,java.lang.IllegalArgumentException:無法設置float字段javax.swing.text.html.ImageView.vAlign爲(double)0.5。我使用privateStringField.setFloat(layeredPane,(float)0.75);沒有錯誤,它不起作用:'( – user1221483 2012-02-25 20:51:47

3

首先,爲什麼要使用2.0?我認爲vAlign使用分別持有1.0f,0.5f和0.0f的BOTTOM_ALIGNMENT,CENTER_ALIGNMENT和TOP_ALIGNMENT的java.awt.Component contants,因此2.0的值可能沒有多大意義。

無論如何,因爲它是一個私人領域,不要直接擺弄它,並通過適當的方式改變它。看來,這傢俬人領域是通過屬性設置:

Object alignment = attr.getAttribute(HTML.Attribute.ALIGN); 
+0

我犯了一個錯誤,應該0.75的值。 – user1221483 2012-02-25 20:24:01

+0

@ user1221483:但是爲什麼?0.75是什麼意思?只有三個垂直HTML圖像標記對齊屬性:頂部,中間和底部,就是這樣。 – 2012-02-25 20:24:33

+0

@HovercraftFullOfEels HALFWAY_BETWEEN_MIDDLE_AND_BOTTOM_ALIGNMENT :) – biziclop 2012-02-25 20:29:08