0

I'm trying to access a document class that has id, name, text and list of words. I try to compare id which I have with the ids and when found get the list of words attached to this id to find exact word. I was trying with java reflection but I'm unable to get it working?
Any help is highly appreciated.

public class Doc { private static int documentID; private static Doc docInstance = null; private String documentText; private ArrayList<String> listOfTokens; static int docCount = 0; public Doc() { documentID = 0; listOfTokens = new ArrayList<String>(); tokFreq = 0; docCount++; } public static Doc getDocInstance() { if (docInstance == null) { docInstance = new Doc(); } return docInstance; } public ArrayList<String> getListOfTokens() { return listOfTokens; } } 

and I am trying this

public static void createDocumentVector(TreeMap<Integer,Integer> documentVector, TreeMap<String, ArrayList<Integer>>qm, int N) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { int eachDoc = 0; Collection<String> allKeys = qm.keySet(); ArrayList<Integer> l1 = new ArrayList<Integer>(); boolean addedTerm = false; /** Obtain an Iterator for Collection */ Iterator<String> itr = allKeys.iterator(); String key; int termFrequency = 0; int documentFrequency = 0; /** Iterate through TreeMap values iterator */ while(itr.hasNext()) { key = (String)itr.next(); Integer LL = 0; l1 = qm.get(key); // Returns value of that key for (int k = 0; k < l1.size(); k++) { LL = l2.get(k); Doc obj = new Doc(); Class<? extends Doc> docOb = obj.getClass(); Field field1 = docOb.getDeclaredField("documentID"); field1.setAccessible(true); Field field2 = docOb.getDeclaredField("listOfTokens"); field1.setAccessible(true); if (field1.isAccessible()) { Method setID = docOb.getDeclaredMethod("setDocumentID", new Class[]{int.class}); setID.setAccessible(true); setID.invoke(docOb, LL); } Method listTock = docOb.getMethod("getListOfTokens"); ArrayList<String> per = (ArrayList<String>) listTock.invoke(docOb, null); for (String tock : per) { if(tock.equals(key)) { termFrequency++; } } documentFrequency = l1.size(); eachDoc.add(getTFIDF(termFrequency, documentFrequency, N)); documentVector.put(eachDoc, LL); addedTerm = true; } } } 

And I get this error

Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) 
3
  • It might be a good idea to ask for a code review on codereview.stackexchange.com, I'm seeing quite a few things that seem a little unusual in the code you posted. They aren't specific to the error you're seeing, just general items. Commented Jun 30, 2016 at 3:13
  • Any reason why you are using reflection on this simple task? You are explicitly creating a Doc instance after all. Commented Jul 4, 2016 at 2:04
  • OK, maybe i wont implement Reflection anymore here! Any suggestions??, since doc class has nothing to holdall docs ids. Maybe i should add hashmap to store doc ids and their list of tockens?? Commented Jul 4, 2016 at 10:55

2 Answers 2

3

TreeMap<List<Integer>,Integer> causes an error, due to this explanation in the javadoc.

The map is sorted according to the {@linkplain Comparable natural ordering} of its keys

But List does not implement the Comparable interface. So you can't use List<Integer> as a key in a TreeMap.

My English is poor, hope you can understand!

Sign up to request clarification or add additional context in comments.

1 Comment

I know that, and I changed it but still getting same error!! Any suggestions please..
0

Did you post the complete definition of Doc? It's missing the setDocumentID method.

Anyway, I was able to reproduce your error with the following code:

public class DocReflection { private static int documentId; // static field private void setDocumentId(int docId) { // but setter is not static. documentId = docId; } public static void main(String [] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { DocReflection docReflection = new DocReflection(); Class<? extends DocReflection> cls = docReflection.getClass(); Field docId = cls.getDeclaredField("documentId"); docId.setAccessible(true); if (docId.isAccessible()) { Method setId = cls.getDeclaredMethod("setDocumentId", new Class[]{int.class}); setId.setAccessible(true); setId.invoke(cls, 1); // <-- Invoking non-static method with class object. } } } 

Output:

Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.company.DocReflection.main(DocReflection.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Solution is to make setDocumentId static.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.