按照以往的方法,如果要调用一个类里面的private的属性或方法,那只有在那个类里写一个public的方法,然后通过这个方法来调用它类内的private的属性或方法,然后在类外调用那个public的方法就可以了。但是网上看到一篇文章介绍了另一种方法,因为如果你要调用的private的属性所在的类是jar包,也就是你不能修改了,那上面说的方法就没办法了,这时候就要用反射机制。
比如那个类如下:
- public class Smss {
- private String destID;
- private String content;
- private String mobile;
- public String getDestID() {
- return destID;
- }
- public String getContent() {
- return content;
- }
- public String getMobile() {
- return mobile;
- }
- }
在另一个类的main方法里调用它的私有属性并赋值:
- public static void main(String[] args) {
- Object object = getInstance(Smss.class, "destID,01201101", "mobile,15810022404", "content,测试数据。");
- Smss sms = (Smss) object;
- System.out.println("短信内容:" + sms.getContent());
- System.out.println("手机号码:" + sms.getMobile());
- System.out.println("尾号:" + sms.getDestID());
- }
现在就需要写getInstance方法了:
- /**
- * 用于对类的字段赋值,无视private,project修饰符,无视set/get方法
- * @param c 要反射的类
- * @param args 类的字段名和值 每个字段名和值用英文逗号隔开
- * @return
- */
- @SuppressWarnings("unchecked")
- public static Object getInstance(Class c, String... args) {
- try {
- Object object = Class.forName(c.getName()).newInstance();
- Class<?> obj = object.getClass();
- Field[] fields = obj.getDeclaredFields();
- for (int i = 0; i < fields.length; i++) {
- fields[i].setAccessible(true);
- for (int j = 0; j < args.length; j++) {
- String str = args[j];
- String strs[] = str.split(",");
- if (strs[0].equals(fields[i].getName())) {
- fields[i].set(object, strs[1]);
- break;
- }
- }
- }
- return object;
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- return null;
- }
在上述代码中可以看到fields[i].serAccessible(true)这表示从Smss类中迭代出来的每一个属性不论是public,private,还是protected外类都有权限进入。这就更改了java自身的权限管理。
转载于:https://blog.51cto.com/4045060/762332