導航:首頁 > 編程語言 > java反射訪問私有方法

java反射訪問私有方法

發布時間:2023-09-13 01:25:51

java反射調用private方法

Java程序不能訪問持久化類的private方法,但是利用JAVA的反射機制可以實現調用,代碼如下:

<spanstyle="font-size:14px;">
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsException{
Methodmethod=PackageClazz.class.getDeclaredMethod("privilegedMethod",newClass[]{String.class,String.class});
method.setAccessible(true);
method.invoke(newPackageClazz(),"452345234","q31234132");
}
}
classPackageClazz{
privatevoidprivilegedMethod(StringinvokerName,Stringadb){
System.out.println("---"+invokerName+"----"+adb);
}
}
</span>
#程序輸出結果為:---452345234----q31234132

⑵ java反射機制可以調用到私有方法,是不是就破壞了JAVA的卦裝性呢。

這是一個很值得探討的問題,許多人接觸反射時,對反射功能之強大都會抱有懷疑,感覺嚴重破壞了封裝的性質。可是,什麼是封裝,什麼是安全呢?
封裝,是將具體的實現細節隱藏,而把功能作為整體提供給類的外部使用,也就是說,公有方法能夠完成類所具有的功能。當別人使用這個類時,如果通過反射直接調用私有方法,可能根本實現不了類的功能,甚至可能會出錯,因此通過反射調用私有方法可以說是沒有任何用處的,開發人員沒有必要故意去破壞封裝好的類。從這點上看,封裝性並沒有被破壞。
所謂安全,如果意思是保護實現源碼不被別人看見,那沒有作用。不用反射也能輕易獲取源碼。
所以我以為反射機制只是提供了一種強大的功能,使得開發者能在封裝之外,按照特定的需要實現一些功能。就好比核技術,雖然造核彈很危險吧,但造核電站還是很有用處的(這個比喻似乎不是很恰當,將就將就)。

曾經給朋友討論過這個問題,感覺解釋得不是很清楚,大家一起探討探討,看看怎樣表述才能更容易理解:)

⑶ java 怎麼用反射訪問私有變數

field2.setAccessible(true);
訪問之前對訪問的屬性加上上面這句話才行。

⑷ java反射機制怎樣調用類的私有方法

的一段簡易實例代碼如下:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* @author thomaslwq
* @version 創建時間:Sep 4, 2012 9:53:49 PM
* 類說明
*/
public class ReflectionTest {

public static void setObjectColor(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAcces***ception, InvocationTargetException{
Class cls = obj.getClass();
//獲得類的私有方法
Method method = cls.getDeclaredMethod("privateMethod", null);
method.setAccessible(true); //沒有設置就會報錯
//調用該方法
method.invoke(obj, null);
}
public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAcces***ception, InvocationTargetException{

setObjectColor(new MyTest());
}
}
//測試類
class MyTest{

public void setMyTest(){
System.out.println("setMyTest");
}
/**
類的私有方法
**/
private void privateMethod(){
System.out.println("調用了 private Method");
}

}

⑸ java反射,調用private的方法

soeasy
Stringpath=「com.test.B」
Classclazz=Class.forName(path);//獲得b的反射
Bb=(B)clazz.newInstance();//前提是b類有個無參構造函數
Methodm=clazz.getDeclaredMehod("SetName",String.class);
m.setAccessible(true);//不做安全檢查,你才可以去訪問專私有方法
m.invoke(b,"哈哈");

這里是給屬B裡面的(下面這個方法進行調用賦值)
privatevoidSetName(Strings){}


psgetDeclaredMehod是對私有的方法進行調用要訪問必須加setAccessible
getMehod是對通用方法進行調用,不用加setAccessible

⑹ 反射機制訪問私有方法代碼異常"java.lang.ClassCastException"

Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance(); // package com.testspring.reflect;

雖然類名相同,但包名不同,不是同一個類,所以不能轉換。

Java中只版有類的和包名完權全相同,才是同一個類。

改為:
com.baobaotao.reflect.PrivateCar pcar = (com.baobaotao.reflect.PrivateCar)clazz.newInstance();
或者
Class clazz = loader.loadClass("com.testspring.reflect.PrivateCar");

⑺ java里一個私有的屬性如何在其他類裡面進行訪問

主要有兩種方式:
第一種方式
在這個私有屬性的類中為該屬性提供get和set方法。
第二針方式
如果不能提供get和set方法就用反射來獲取,Java中說的封裝可以被反射打破。

⑻ java反射訪問私有方法的的問題

Java反射之訪問私有屬性或方法

AccessibleObject類是Field、Method、和Constructor對象的基類。它提供了將反射的對象標記為在使用時取消默認Java語言訪問控制檢查的能力。對於公共成員、默認(打包)訪問成員、受保護成員和私有成員,在分別使用Field、Method和Constructor對象來設置或獲得欄位、調用方法,或者創建和初始化類的新實例的時候,會執行訪問檢查。

當反射對象的accessible標志設為true時,則表示反射的對象在使用時應該取消Java語言訪問檢查。反之則檢查。由於JDK的安全檢查耗時較多,所以通過setAccessible(true)的方式關閉安全檢查來提升反射速度。

舉例代碼:
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* 用Java反射機制來調用private方法
* @author pieryon
*
*/

public class Reflect {

public static void main(String[] args) throws Exception {

//直接創建對象
Person person = new Person();

Class<?> personType = person.getClass();

//訪問私有方法
//getDeclaredMethod可以獲取到所有方法,而getMethod只能獲取public
Method method = personType.getDeclaredMethod("say", String.class);

//抑制Java對訪問修飾符的檢查
method.setAccessible(true);

//調用方法;person為所在對象
method.invoke(person, "Hello World !");

//訪問私有屬性
Field field = personType.getDeclaredField("name");

field.setAccessible(true);

//為屬性設置值;person為所在對象
field.set(person, "WalkingDog");

System.out.println("The Value Of The Field is : " + person.getName());

}
}

//JavaBean
class Person{
private String name;

//每個JavaBean都應該實現無參構造方法
public Person() {}

public String getName() {
return name;
}

private void say(String message){
System.out.println("You want to say : " + message);
}
}

閱讀全文

與java反射訪問私有方法相關的資料

熱點內容
蘋果免費讀書app推薦 瀏覽:497
劉駿微信 瀏覽:113
書旗舊版本80 瀏覽:467
教編程考什麼證 瀏覽:990
下載編程貓後哪裡有客服 瀏覽:13
如何編輯歌曲文件格式 瀏覽:638
cf無限領取cdk工具 瀏覽:350
如何讓手機文件保存到電腦上 瀏覽:459
sa資料庫默認密碼是多少 瀏覽:191
電腦正在查找文件 瀏覽:541
一個文件盒省內寄順豐多少錢 瀏覽:41
誅仙62坐騎怎麼升級到63 瀏覽:926
linux以日期查看日誌記錄 瀏覽:446
工業大數據是什麼東西 瀏覽:881
魅族note3怎麼重置網路 瀏覽:510
c語言程序設計模 瀏覽:92
兒童怎麼做可編程機 瀏覽:603
數據計算屬於什麼統計學 瀏覽:921
07word怎麼去掉標記 瀏覽:979
qq緩存的數據是什麼 瀏覽:348

友情鏈接