按照以往的方法,如果要调用一个类里面的private的属性或方法,那只有在那个类里写一个public的方法,然后通过这个方法来调用它类内的private的属性或方法,然后在类外调用那个public的方法就可以了。但是网上看到一篇文章介绍了另一种方法,因为如果你要调用的private的属性所在的类是jar包,也就是你不能修改了,那上面说的方法就没办法了,这时候就要用反射机制。

比如那个类如下:

 

 
  
  1. public class Smss {  
  2.     private String destID;  
  3.     private String content;  
  4.     private String mobile;  
  5.     public String getDestID() {  
  6.         return destID;  
  7.     }  
  8.     public String getContent() {  
  9.         return content;  
  10.     }  
  11.     public String getMobile() {  
  12.         return mobile;  
  13.     }  
  14.       

在另一个类的main方法里调用它的私有属性并赋值:

 

 
  
  1. public static void main(String[] args) {  
  2.         Object object = getInstance(Smss.class"destID,01201101""mobile,15810022404""content,测试数据。");  
  3.                 Smss sms = (Smss) object;  
  4.                 System.out.println("短信内容:" + sms.getContent());  
  5.                 System.out.println("手机号码:" + sms.getMobile());  
  6.                 System.out.println("尾号:" + sms.getDestID());  
  7.     }  

现在就需要写getInstance方法了:

 

 
  
  1. /**  
  2.      * 用于对类的字段赋值,无视private,project修饰符,无视set/get方法  
  3.      * @param c 要反射的类  
  4.      * @param args 类的字段名和值 每个字段名和值用英文逗号隔开  
  5.      * @return  
  6.      */ 
  7.     @SuppressWarnings("unchecked")  
  8.     public static Object getInstance(Class c, String... args) {  
  9.         try {  
  10.             Object object = Class.forName(c.getName()).newInstance();  
  11.             Class<?> obj = object.getClass();  
  12.             Field[] fields = obj.getDeclaredFields();  
  13.             for (int i = 0; i < fields.length; i++) {  
  14.                 fields[i].setAccessible(true);  
  15.                 for (int j = 0; j < args.length; j++) {  
  16.                     String str = args[j];  
  17.                     String strs[] = str.split(",");  
  18.                     if (strs[0].equals(fields[i].getName())) {  
  19.                         fields[i].set(object, strs[1]);  
  20.                         break;  
  21.                     }  
  22.                 }  
  23.             }  
  24.             return object;  
  25.         } catch (IllegalAccessException e) {  
  26.             e.printStackTrace();  
  27.         } catch (ClassNotFoundException e) {  
  28.             e.printStackTrace();  
  29.         } catch (InstantiationException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.         return null;  
  33.     }  

在上述代码中可以看到fields[i].serAccessible(true)这表示从Smss类中迭代出来的每一个属性不论是public,private,还是protected外类都有权限进入。这就更改了java自身的权限管理。