Я попытался получить доступ к другим методам в классе - и не смог
найти их тоже .. Я не уверен, почему я могу сбросить содержимое
класс - и я могу видеть все методы .. Но, так или иначе, CF получает
сбит с толку и не может найти их, когда я пытаюсь позвонить им ..
tldr;
Чтобы уточнить "почему", это красная сельдь. Настоящая причина ошибки в том, что DocumentBuilder равен abstract
. Вы не можете создать экземпляр абстрактного класса. Как описано в существующем ответе , вы можете создать новый экземпляр только через DocumentBuilderFactory .
подробно:
То, что фактически возвращает CreateObject, является прокси для класса java. Хотя это может выглядеть как экземпляр класса java, это не так. Это просто обертка. Заметьте, что созданный вручную прокси-объект выглядит идентично вашей переменной в cfdump?
nd = createObject("java","javax.xml.parsers.DocumentBuilder");
proxy = createObject("java", "coldfusion.runtime.java.JavaProxy").init(nd.getClass());
writeDump(var=proxy, label="This is the JavaProxy");
writeDump(var=nd, label="This is the Variable 'nd'");
![Dump of Proxy Object](https://i.stack.imgur.com/R0BNr.png)
Относительно того, почему CF "не может найти методы", ну ... это вводит в заблуждение. Что на самом деле означает ошибка (в данном конкретном случае), так это то, что метод существует, но ... у вас еще нет доступа к нему.
Существует два соответствующих типа методов:
- методы экземпляра : принадлежат конкретному экземпляру класса
- статические методы : Принадлежит всему классу и может быть вызван без предварительного создания экземпляра класса
Из-за того, как работает JavaProxy, пока вы не создадите новый экземпляр с init(..)
, у вас есть доступ только к статическим методам.
Методы в вашем дампе, такие как newInstance()
, являются методами экземпляра. Поскольку ваш код не вызывает init(...)
, когда CF ищет доступные методы, он не находит newInstance()
, и поэтому вы получаете «ошибка метода не найдена».
Вылов 22:
Конечно, если бы вы попытались создать экземпляр этого конкретного класса:
nd.init();
... это бы не получилось. Причина в том, что DocumentBuilder является абстрактным классом , поэтому вы не можете создать его экземпляр. Однако это, по крайней мере, привело бы к более точному сообщению об ошибке:
Невозможно найти конструктор для класса
javax.xml.parsers.DocumentBuilder, который принимает параметры типа ('').
Короче говоря, сообщение об ошибке вводит в заблуждение. Метод действительно есть, он просто не был доступен, потому что у вас не было надлежащего «экземпляра» класса. Как объясняет существующий ответ , единственный способ получить правильный экземпляр - через DocumentBuilderFactory .