反射setAccessible()方法

java代码中,常常将一个类的成员变量置为private

在类的外面获取此类的私有成员变量的value时,需要注意:

测试类:

Java代码
  1. publicclassAccessibleTest{
  2. privateintid;
  3. privateStringname;
  4. publicAccessibleTest(){
  5. }
  6. publicintgetId(){
  7. returnid;
  8. }
  9. publicvoidsetId(intid){
  10. this.id=id;
  11. }
  12. publicStringgetName(){
  13. returnname;
  14. }
  15. publicvoidsetName(Stringname){
  16. this.name=name;
  17. }
  18. }

Main类:

Java代码
  1. publicclassMain{
  2. publicstaticvoidmain(String[]args)throwsException{
  3. Classclazz=Class.forName("com.test.accessible.AccessibleTest");
  4. AccessibleTestat=newAccessibleTest();
  5. at.setId(1);
  6. at.setName("AT");
  7. for(Fieldf:clazz.getDeclaredFields()){
  8. f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作
  9. System.out.println(f.get(at));//获取当前对象中当前Field的value
  10. }
  11. }
  12. }

如果没有在获取Field之前调用setAccessible(true)方法,异常:

Java代码
  1. java.lang.IllegalAccessException:
  2. Classcom.test.accessible.Main
  3. cannotaccess
  4. amemberofclasscom.test.accessible.AccessibleTest
  5. withmodifiers"private"

当然在AccessibleTest类的内部(AccessibleTest的内部类除外)

进行如上操作则不需要调用setAccesible()方法

java代码中,常常将一个类的成员变量置为private

在类的外面获取此类的私有成员变量的value时,需要注意:

测试类:

Java代码
  1. publicclassAccessibleTest{
  2. privateintid;
  3. privateStringname;
  4. publicAccessibleTest(){
  5. }
  6. publicintgetId(){
  7. returnid;
  8. }
  9. publicvoidsetId(intid){
  10. this.id=id;
  11. }
  12. publicStringgetName(){
  13. returnname;
  14. }
  15. publicvoidsetName(Stringname){
  16. this.name=name;
  17. }
  18. }

Main类:

Java代码
  1. publicclassMain{
  2. publicstaticvoidmain(String[]args)throwsException{
  3. Classclazz=Class.forName("com.test.accessible.AccessibleTest");
  4. AccessibleTestat=newAccessibleTest();
  5. at.setId(1);
  6. at.setName("AT");
  7. for(Fieldf:clazz.getDeclaredFields()){
  8. f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作
  9. System.out.println(f.get(at));//获取当前对象中当前Field的value
  10. }
  11. }
  12. }

如果没有在获取Field之前调用setAccessible(true)方法,异常:

Java代码
  1. java.lang.IllegalAccessException:
  2. Classcom.test.accessible.Main
  3. cannotaccess
  4. amemberofclasscom.test.accessible.AccessibleTest
  5. withmodifiers"private"

当然在AccessibleTest类的内部(AccessibleTest的内部类除外)

进行如上操作则不需要调用setAccesible()方法

你可能感兴趣的:(Access)