fun initTypeface( name:String, path :String) {
try {
val field = Typeface::class.java.getDeclaredField(name)
field.isAccessible = true
field.set(null, Typeface.createFromAsset(CoreApp.get().assets, path))
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
}
上面代碼是我的一個用來修改字體的方法。用到了反射修改Typeface類中的字段。
/** The NORMAL style of the default serif typeface. */
public static final Typeface SERIF;
//...
static {
init();
// Set up defaults and typefaces exposed in public API
//..
SERIF = create("serif", 0);
//..
}
可以看到這個靜態(tài)成員在初始化的時候就被賦值了。但是我的反射方法卻有效果?的確修改掉了字段。
所以我就寫了以下代碼來看反射是否能修改字段。
//FinalTest
class FinalTest {
public static void main(String[] args) {
try {
Field field = TestHelper.class.getDeclaredField("ENTITY");
field.setAccessible(true);
Entity entity = new Entity("reflection name");
field.set(null, entity);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(TestHelper.getENTITY().name);
}
static class Entity {
public String name;
public Entity(String name) {
this.name = name;
}
}
}
//..TestHelper
class TestHelper {
private static final FinalTest.Entity ENTITY;
static {
ENTITY = new FinalTest.Entity("init name");
}
public static FinalTest.Entity getENTITY() {
return ENTITY;
}
}
想通過反射的方法修改TestHelper中的ENTITY字段,但是沒有成功 。沒有被修改掉。而且拋出了異常。
Can not set static final com.company.finaltest.Entity field
java.lang.IllegalAccessException: Can not set static final com.company.finaltest.Entity field com.company.finaltest.TestHelper.ENTITY to com.company.finaltest.Entity
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:76)
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:80)
at sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl.set(UnsafeQualifiedStaticObjectFieldAccessorImpl.java:77)
at java.lang.reflect.Field.set(Field.java:764)
at com.company.finaltest.FinalTest.main(FinalTest.java:13)
所以我就很奇怪,為什么一開始的代碼可以修改掉final的值?
——————————
更新,是因為我的代碼被編譯器優(yōu)化了?
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。