㈠ java中私有屬性可以通過反射獲取,那設置成私有是不是沒多大意思
私有、公有這些訪問控制,主要是針對類的擴展或子類化設置的,針對現實世界的抽象和封裝。
一般都是一些Web框架需要用反射,日常代碼裡面一般不用,用到的時候一般來說破壞了面向對象的特性。
㈡ java 反射 能直接對私有屬性賦值么不通過set方法
設置
A a = new A();
Field field = a.getClass().getDeclaredField("x");
field.setAccessible(true);
field.set(a, 1);
讀取
Field f = a.getClass().getDeclaredField("x");
f.setAccessible(true);
System.out.println(f.get(a));
㈢ java中,利用反射可以調用私有的屬性,那麼私有還有什麼意義,求大神解答。
因為現實世界中,都沒有絕對的限制,而且有很多奇葩的需求,說不定什麼時候就需要破壞原有的結構,反射在特定條件下是必要的
㈣ java里一個私有的屬性如何在其他類裡面進行訪問
既然是私有屬性就不建議直接訪問的,一般會提供方法來訪問私有屬性,這樣可以在方法中對屬性的訪問做一些控制。
當然也可以通過反射來直接訪問。
我們准備一個包含私有屬性的類
然後通過反射來訪問屬性,記得一定要加aField.setAccessible(true);這句代碼,不然就不能訪問私有屬性。
不加aField.setAccessible(true);
加了aField.setAccessible(true);
㈤ 一個java對象的屬性是私有的,而且沒有提供public的get和set方法,可以用反射的方式將其轉成json嗎
如果提供了get和set方法是可以實現的,因為變數是私有的,只能通過外部公用方法去訪問這些變數,如果沒有這些方法就只能通過本類訪問,其他類沒有辦法訪問
㈥ Java通過反射可以設置私有變數的好處有哪
Java通過反射可以設置私有變數的好處有
public class PrivateTest { private String name = "hello"; public String getName() { return name; } } public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(pt, "world"); field.setAccessible(false); System.out.println(pt.getName()); } } 這樣通過反射可以設置私有變數,Java當時設計的時候是出於什麼考慮的呢?
但是也有應用的場景,可以想到的是: hibernate中你定義實體類及相應的欄位(和資料庫表對應),你可以在映射文件中配置: 當你從資料庫中獲取到數據後,是調用類的setxxx()方法,還是直接給欄位賦值,這里欄位是可以設置成private的,用的就是反射。那java反射可以設置私有變數的值,是好處多還是壞處多呢? 問題補充:robertliudeqiang 寫道提供了一種介面吧,一般情況下不會用的。
但是也有應用的場景,可以想到的是: hibernate中你定義實體類及相應的欄位(和資料庫表對應),你可以在映射文件中配置: 當你從資料庫中獲取到數據後,是調用類的setxxx()方法,還是直接給欄位賦值,這里欄位是可以設置成private的,用的就是反射。目前反射設置private變數的值,還未看出是有好處 的。
那應該是java的一個問題遺留,為了兼容沒法解決的。
㈦ Java版《我的世界》Forge反射找不到私有方法和屬性名是什麼原因
你好,很高興回答你的問題。
試試getDeclaredFields和getDeclaredMethods。
如果有幫助到你,請點擊採納。
㈧ java反射機制怎麼判斷一個屬性是否為私有屬性
private,public類似與 WEB系統中管理員,普通用戶許可權 . 是一種許可權安全機制 反射的主要目的並不在與看到私有方法,更重要的是能在運行時可以動態自查自己的結構,在開發某些功能時特別有用, 例如:(1)把XML節點自動映射後JAVA BEAN中.
㈨ java反射訪問私有方法的的問題
java的反射可以繞過訪問許可權,訪問到類的私有方法和成員。可能這點會引起安全性的討論。反射的使用幫助解決很多復雜的問題,其運行時的類型檢查,動態調用,代理的實現等,反射為我們寫程序帶來了很大的靈活性,很多功能都是基於反射。
利用反射還可以訪問內部類、匿名內部類的私有屬性。
用java自帶的java -private 類名 反編譯命令可以查看類的完整定義。(參考think in java)
下面舉例子說明。首先定義一個介面
Java代碼
public interface Ref {
public void f();
}
public interface Ref {
public void f();
}
介面的實現類
Java代碼
public class RefImpl implements Ref {
//實現介面方法
public void f() {
System.out.println("public method f()");
}
void g(String args){
System.out.println("package method g():" + args);
}
private void w(){
System.out.println("private method w()");
}
}
public class RefImpl implements Ref {
//實現介面方法
public void f() {
System.out.println("public method f()");
}
void g(String args){
System.out.println("package method g():" + args);
}
private void w(){
System.out.println("private method w()");
}
}
測試類
Java代碼
public class TestRef {
public static void main(String[] args) {
Ref ref = new RefImpl();
System.out.println(ref.getClass().getSimpleName()); //RefImpl類型
ref.f(); //調用介面方法
// ref.g(); //向上轉型後實現類添加的方法不能調用
if(ref instanceof RefImpl){
RefImpl ref1 = (RefImpl)ref; //類型識別後轉型
ref1.g("zhouyang");
// ref1.w(); //私有方法不能訪問
}
//通過反射調用方法
try {
Ref ref2 = new RefImpl();
Method m = ref2.getClass().getDeclaredMethod("f");
Method m1 = ref2.getClass().getDeclaredMethod("g", String.class);//有參的方法
Method m2 = ref2.getClass().getDeclaredMethod("w");
System.out.println("==============");
m.invoke(ref); //調用方法f()
m1.invoke(ref, "yangzhou");
m2.setAccessible(true);///調用private方法的關鍵一句話
m2.invoke(ref);
} catch (Exception e) {
e.printStackTrace();
}
//java的javap反編譯能夠查看類的信息,-private 開關能夠打開所有信息
//javap -private 類名 類必須是編譯成.calss 文件
//利用反射訪問私有成員,改變私有成員值,但是final域可以訪問不可改變
PrivateField pf = new PrivateField();
// ps.ss; //私有成員不能訪問
//列印原來的成員值
pf.print();
try {
//反射訪問和改變原來值
Field[] f = pf.getClass().getDeclaredFields();
for(int i=0;i<f.length;i++){
f[i].setAccessible(true);
System.out.println(f[i].getType());//列印欄位類型
System.out.println(f[i].get(pf)); //列印值
if("ss".equals(f[i].getName())){
f[i].set(pf, "hehe"); //修改成員值
}else{
f[i].setInt(pf, 55);
}
}
//重新列印修改後的成員值,final域值不變
pf.print();
} catch (Exception e) {
e.printStackTrace();
}
/*列印輸出的結果
* RefImpl
public method f()
&nb
㈩ Java反射 在只知道類名的情況下,怎樣給其中的私有屬性賦值
利用反射能
//假設類名為A
//實例化類
Ap=newA();
//獲取class
Classc=p.getClass();
//獲取該類所有的欄位
Field[]fields=c.getDeclaredFields();
//遍歷賦值
for(inti=0;i<fields.length;i++){
StringfiledName=fields[i].getName();
//AccessibleTest類中的成員變數為private,故必須進行此操作
fields[i].setAccessible(true);
//判斷類型
Class<?>type=fields[i].getType();
//獲取欄位類型
StringtypeName=type.getName();
System.out.println(type.getName());
//對欄位進行賦值第一個參數為對象引用第二個參數為要附的值
//如果為字元串類型
if("java.lang.String".equals(typeName)){
fields[i].set(p,"1");
}
//如果為日期類型
elseif("java.util.Date".equals(typeName)){
fields[i].set(p,newDate());
}
else{
fields[i].set(p,1);
}
}
//樓主我只是簡單的寫了下。可能還需要判斷欄位名稱以及其他類型什麼的。
最後希望樓主多看看java 文檔。