到达serialPersistentFields中声明的静态字段

时间:2015-07-07 13:47:09

标签: java reflection xstream

所以xstream(v1.4.8)有这一行

  private  class ListenChange extends BroadcastReceiver {

        @Override
        public void onReceive(final Context context, Intent intent) {

            if(intent.getAction().equals(ConversationListActivityNew.action_change))
            {
                if(is_activity_visible) {
                    if (uri != null&&adapter!=null) {
//                          adapter =null;
//                          adapter = new MessageAdapterNew(MessageListActivityNew.this, uri, searched_text);
//                          setListAdapter(adapter);
                             new AsyncTask<Void,Void,Void>()
                             {

                                 @Override
                                 protected Void doInBackground(Void... voids) {
                                     adapter.getData(MessageListActivityNew.this,uri);
                                     return null;
                                 }

                                 @Override
                                 protected void onPostExecute(Void aVoid) {
                                     Log.e("notifying row","notifying row");
                                     MessageListActivityNew.this.adapter.notifyDataSetChanged();
                                     super.onPostExecute(aVoid);
                                 }
                             }.execute();

                    }
                }

            }

        }
    }

https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-Dynamic-PartitionInsert
试图到达名为&#34; list&#34;的字段(field.getName()返回&#34; list&#34;)

private Object More ...readField(ObjectStreamField field, Class type, Object instance) {
        try {
           Field javaField = type.getDeclaredField(field.getName());

more here中声明,但遇到NoSuchFieldException。那是为什么?

1 个答案:

答案 0 :(得分:0)

ObjectStreamField描述了存储在序列化流中的字段。虽然默认机制将为类的每个实例字段创建ObjectStreamField,但是通过static final ObjectStreamField[] serialPersistentFields字段覆盖它的可能性恰好是为了声明执行 not 匹配实际的实例字段。

这些字段无法通过反射读取和写入字段值的默认算法进行处理。相反,需要专用的writeObjectreadObject方法来读取和写入流字段并处理它们的值。

这里的问题是类VirtualFilePermissionCollection有一个不匹配的字段声明,因为流字段名为list,实际的实例字段名为permissions,并且是一个合适的{ {1}}方法(尽管不必使用Reflection来访问其字段)但缺少匹配的readObject方法。由于缺少专用的writeObject方法,因此使用默认算法并失败,因为如上所述,字段不匹配。