1.修改java類的final屬性,使其可以繼承
如:final class A{
}
現在如果想讓A能被B繼承,注意A是第三方jar中的,你不能修改源碼,此時可以這樣處理:
Class aClass = A.class;
Class classClass = Class.class;
Field accessFlagsFiled = classClass.getDeclaredField("accessFlags");
accessFlagsFiled.setAccessible(true);
int accessFlags = (Integer) accessFlagsFiled.get(aClass);
accessFlags = accessFlags & (~Modifier.FINAL);
accessFlagsFiled.set(aClass, accessFlags);
2.如果想第三方@hide了A類怎麼辦,假設A又是系統類,但是B又要繼承A,此時可以在本地創建個A,根據雙親委派模式原則,A是不會被訪問到的,因爲每次load A時都用的是系統A。
3.使用反射時,如果你現在有A中內部類B的實例,需要通過反射得到A對象,可以使用this.$0來獲取
Field aField = bIns.getClass().getDeclaredField("this$0"); A a = aField.get(bIns);