java私有方法訪問
1. java中我把外部類方法私有了 內部類如何訪問該方法 代碼如下
private int x=3;
int a;
static class Inner
{
int x = 4;
public void function() {
int x = 6;
System.out.println(x);
System.out.println(this.x);
// System.out.println(Outer.this.x);//內部類可以直接訪問外部類中的成員,包括私有。(訪問私有)
// method();//內部類可以直接訪問外部類中的成員,包括私有。(該訪問成員)
}
}
public static void main(String[] args){
new Inner().function();
}
只能這樣做,把內部類改成 靜態的 直接new一個類 調方法
2. java 如何訪問類中的私有變數
不能,私有就是只能本類對象及方法訪問。
當然,父類裡面定義了set
get方法,子類必須通過這些方法可以間接訪問到它們。
3. 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
4. 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");
}
}
5. 在java中包私有類的公共方法,其它包的類能訪問嗎
包私有類,其它包的類是不能訪問的
,那如果包私有類中的方法是Public呢
其它包的類還能訪問這個方法嗎
說的私有類只可能是數納
內部類
,因為外部類是只有包或者公開訪問許可權的,
那如果包私有類中的方法是Public呢
其它包的類還能訪問這個方法嗎
假設提問的是內部類,不可以,因為它連這個類都訪問不了,可以這樣理解,一個私有內部類中的方法訪問許可權也肯定沖畢爛是private,散漏不然的話,別人就可以訪問了
6. java中如何調用私有變數或方法
private關鍵字
(1)私有的意義,可以修飾成員變數和成員方法
(2)特點:
被private修飾的後的成員只能在本類中被訪問
(3)private的應用:
以後再寫一個類的時候:
把所有的成員變數給private了
提供對應的getXxx()/setXxx()方法
/*
封裝和private的應用:
A:把成員變數用private修飾
B:提高對應的getXxx()和setXxx()方法
*/
//定義學生類
class Student {
//姓名
private String name;
//年齡
private int age;
//姓名獲取值
public String getName() {
return name;
}
//姓名設置值
public void setName(String n) {
name = n;
}
//年齡獲取值
public int getAge() {
return age;
}
//年齡賦值
public void setAge(int a) {
age = a;
}
}
//測試類
class StudentTest {
public static void main(String[] args) {
//創建學生對象
Student s = new Student();
//使用成員變數
//錯誤:被私有修飾了,外界不能直接訪問了
//System.out.println(s.name+"---"+s.age);
System.out.println(s.getName()+"---"+s.getAge());
//給成員變數賦值
//s.name = "林青霞";
//s.age = 27;
//通過方法給賦值
s.setName("林青霞");
s.setAge(27);
System.out.println(s.getName()+"---"+s.getAge());
}
}
7. JAVA中私有化的好處、訪問類中私有化成員的方法及其原理。
私有化的好處其實就是保證外部不能直接談拆訪問這個變數,一般把欄位私有化,禪昌外部就不能直接訪問這個賀侍扒欄位了,這時需要設計一個方法,javabean就是這個原理,比如一個類中有age,name這兩個私有的成員變數,設計兩個方法,public void setname(String name){this.name=name;} public String getname(){return name;} age的訪問就類似了
8. java里一個私有的屬性如何在其他類裡面進行訪問
既然是私有屬性就不建議直接訪問的,一般會提供方法來訪問私有屬性,這樣可以在方法中對屬性的訪問做一些控制。
當然也可以通過反射來直接訪問。
我們准備一個包含私有屬性的類
然後通過反射來訪問屬性,記得一定要加aField.setAccessible(true);這句代碼,不然就不能訪問私有屬性。
不加aField.setAccessible(true);
加了aField.setAccessible(true);