В Java не удалось вызвать метод с параметрами, хотя кажется, что он соответствует вызову getMethod()JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 В Java не удалось вызвать метод с параметрами, хотя кажется, что он соответствует вызову getMethod()

Сообщение Anonymous »

Я пытаюсь получить доступ к этому классу jna путем отражения (потому что они мне нужны в версии Windows, но не в версии macOS, а изменение в правилах нотаризации MacoS приводит к сбою нотаризации пакета jna. Поэтому, используя отражение, я могу сохранить единую базу кода и поставлять классы ДНК только в версии для Windows)

Код: Выделить всё

package com.sun.jna.platform.win32;

import com.sun.jna.WString;
import com.sun.jna.platform.FileUtils;
import java.io.File;
import java.io.IOException;

public class W32FileUtils extends FileUtils {
public W32FileUtils() {
}

public boolean hasTrash() {
return true;
}

public void moveToTrash(File[] files) throws IOException {
Shell32 shell = Shell32.INSTANCE;
ShellAPI.SHFILEOPSTRUCT fileop = new ShellAPI.SHFILEOPSTRUCT();
fileop.wFunc = 3;
String[] paths = new String[files.length];

int ret;
for(ret = 0; ret < paths.length; ++ret) {
paths[ret] = files[ret].getAbsolutePath();
}

fileop.pFrom = new WString(fileop.encodePaths(paths));
fileop.fFlags = 1620;
ret = shell.SHFileOperation(fileop);
if (ret != 0) {
throw new IOException("Move to trash failed: " + fileop.pFrom + ": " + Kernel32Util.formatMessageFromLastErrorCode(ret));
} else if (fileop.fAnyOperationsAborted) {
throw new IOException("Move to trash aborted");
}
}
}
Это мой код

Код: Выделить всё

package com.jthink.songkong.analyse.duplicates;

import com.jthink.songkong.text.InfoMessage;
import com.jthink.songkong.ui.MainWindow;

import java.io.File;
import java.lang.reflect.Method;
import java.util.logging.Level;

public class WindowsDeleteTrash
{
public boolean deleteTrash( File file)
{
Boolean isHasTrash=false;
boolean result = false;
Object instance = null;
Class  windowsFileUtilsClass = null;
try
{
windowsFileUtilsClass = Class.forName("com.sun.jna.platform.win32.W32FileUtils");
Method instanceClassMethod = windowsFileUtilsClass.getMethod("getInstance");
instance = instanceClassMethod.invoke(null);
Method instanceHasTrashMethod = windowsFileUtilsClass.getMethod("hasTrash");
isHasTrash = (Boolean) instanceHasTrashMethod.invoke(instance, null);
}
catch(Exception ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
return file.delete();
}

if (isHasTrash)
{
try
{
File[] files = new File[1];
files[0] = file;

Method      instanceMoveMethod  = windowsFileUtilsClass.getMethod( "moveToTrash", java.io.File[].class);
instanceMoveMethod.invoke(instance, files);
result = true;
}
//SONGKONG-1559
catch (java.lang.NoClassDefFoundError ncde)
{
MainWindow.logger.log(Level.SEVERE, InfoMessage.MSG_UNABLE_TO_MOVE_TO_TRASH.getMsg() + ncde.getMessage(), ncde);
result = file.delete();
}
//SONGKONG-1090
catch(Exception ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
result = file.delete();
}
}
else
{
result = file.delete();
}
return result;
}
}
Я могу получить экземпляр и вызвать метод hasTrash(), но при вызове метода moveTrash() происходит сбой с < em>несоответствие типа аргумента , Я не могу понять, почему, потому что он получает метод нормально, используя параметр File[], а я передаю ему массив File, так что же я делаю не так
Это трассировка стека

Код: Выделить всё

java.lang.IllegalArgumentException: argument type mismatch
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:107)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at com.jthink.songkong.analyse.duplicates.WindowsDeleteTrash.deleteTrash(WindowsDeleteTrash.java:44)
Следует отметить, что метод экземпляра объявлен для возврата подклассов FileUtils и Windows32FileUtils, но я не вижу, актуально ли это, поскольку вызов hasTrash() работает нормально

Подробнее здесь: https://stackoverflow.com/questions/790 ... -match-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»