java定义私有变量_JavaReflection(七):私有变量和私有⽅
法
在通常的观点中从对象的外部访问私有变量以及⽅法是不允许的,但是Java反射机制可以做到这⼀点。使⽤这个功能并不困难,在进⾏单元测试时这个功能⾮常有效。本节会向你展⽰如何使⽤这个功能。
注意:这个功能只有在代码运⾏在单机Java应⽤(standalone Java application)中才会有效,就像你做单元测试或者⼀些常规的应⽤程序⼀样。如果你在Java Applet中使⽤这个功能,那么你就要想办法去应付SecurityManager对你限制了。但是⼀般情况下我们是不会这么做的,所以在本节⾥⾯我们不会探讨这个问题。
访问私有变量
要想获取私有变量你可以调⽤DeclaredField(String name)⽅法或者DeclaredFields()⽅法。Field(String name)和Fields()只会返回公有的变量,⽆法获取私有变量。下⾯例⼦定义了⼀个包含私有变量的类,在它下⾯是如何通过反射获取私有变量的例⼦:2012年什么命
public classPrivateObject {private String privateString = null;publicPrivateObject(String privateString) {this.privateString
=privateString;
}
}
PrivateObject privateObject= new PrivateObject("The Private Value");
Field privateStringField= PrivateObject.class.
getDeclaredField("privateString");
privateStringField.tAccessible(true);
String fieldValue=(String) (privateObject);
System.out.println("fieldValue = " + fieldValue);327国债事件
这个例⼦会输出”fieldValue = The Private Value”,The Private Value是PrivateObject实例的privateString私有变量的值,注意调⽤DeclaredField(“privateString”)⽅法会返回⼀个私有变量,这个⽅法返回的变量是定义在PrivateObject类中的⽽不是在它的⽗类中定义的变量。
伦敦女孩
注意privateStringField.tAccessible(true)这⾏代码,通过调⽤tAccessible()⽅法会关闭指定类Field实例的反射访问检查,这⾏代码执⾏之后不论是私有的、受保护的以及包访问的作⽤域,你都可以在任何地⽅访问,即使你不在他的访问权限作⽤域之内。但是你如果你⽤⼀般代码来访问这些不在你权限作⽤域之内的代码依然是不可以的,在编译的时候就会报错。
访问私有⽅法
初中数学知识点
访问⼀个私有⽅法你需要调⽤ DeclaredMethod(String name, Class[] parameterTypes)或者DeclaredMethods()⽅法。 Method(String name, Class[] parameterTypes)和Methods()⽅法,只会返回公有的⽅法,⽆法获取私有⽅法。下⾯例⼦定义了⼀个包含私有⽅法的类,在它下⾯是如何通过反射获取私有⽅法的例⼦:
public classPrivateObject {private String privateString = null;publicPrivateObject(String privateString) {this.privateString岁暮杜甫
=privateString;
}privateString getPrivateString(){return this.privateString;
}
}
红苔菜
PrivateObject privateObject= new PrivateObject("The Private Value");
Method privateStringMethod= PrivateObject.class.
getDeclaredMethod("getPrivateString", null);蒸肉粉蒸肉的家常做法
privateStringMethod.tAccessible(true);
猫的简笔画String returnValue=(String)
privateStringMethod.invoke(privateObject,null);
System.out.println("returnValue = " + returnValue);
这个例⼦会输出”returnValue = The Private Value”,The Private Value是PrivateObject实例的getPrivateString()⽅法的返回值。
DeclaredMethod(“privateString”)⽅法会返回⼀个私有⽅法,这个⽅法是定义在PrivateObject类中的⽽不是在它的⽗类中定义的。
同样的,注意Method.tAcessible(true)这⾏代码,通过调⽤tAccessible()⽅法会关闭指定类的Method实例的反射访问检查,这⾏代码执⾏之后不论是私有的、受保护的以及包访问的作⽤域,你都可以在任何地⽅访问,即使你不在他的访问权限作⽤域之内。但是你如果你⽤⼀般代码来访问这些不在你权限作⽤域之内的代码依然是不可以的,在编译的时候就会报错。