java sdk 12的JFXTextField的IllegaAccessException

java sdk 12的JFXTextField的IllegaAccessException,java,javafx,jfoenix,Java,Javafx,Jfoenix,我在javafx应用程序中添加了JFXTextField,但我得到了这个错误,却不知道如何解决它 类com.jfoenix.skins.JFXTextFieldSkin(在模块com.jfoenix中)无法访问修改器为“private”的类javafx.scene.control.skin.TextFieldSkin(在模块javafx.controls中)的成员 控制器: package sample; import com.jfoenix.controls.JFXButton; impor

我在javafx应用程序中添加了JFXTextField,但我得到了这个错误,却不知道如何解决它

类com.jfoenix.skins.JFXTextFieldSkin(在模块com.jfoenix中)无法访问修改器为“private”的类javafx.scene.control.skin.TextFieldSkin(在模块javafx.controls中)的成员

控制器:

package sample;

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextField;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

@FXML
private Button clickMe;


@FXML
private JFXButton materialButton;

@FXML
private JFXTextField textField;


@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

    materialButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent actionEvent)
        {
            String text = textField.getText().trim();
            System.out.println(text);
        }
    });

}
}
包装样品;
导入com.jfoenix.controls.JFXButton;
导入com.jfoenix.controls.JFXTextField;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.control.Button;
导入java.net.URL;
导入java.util.ResourceBundle;
公共类控制器实现可初始化{
@FXML
私人按钮点击我;
@FXML
专用JFXButton材质按钮;
@FXML
私有JFXTextField textField;
@凌驾
公共void初始化(URL、ResourceBundle、ResourceBundle){
materialButton.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent ActionEvent)
{
String text=textField.getText().trim();
System.out.println(文本);
}
});
}
}
Sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #fcda;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Button fx:id="clickMe" layoutX="198.0" layoutY="188.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="225.0" style="-fx-background-color: #fffe;" text="Click Me" textFill="#722929" />
      <JFXButton fx:id="materialButton" layoutX="231.0" layoutY="82.0" prefHeight="54.0" prefWidth="139.0" style="-fx-background-color: #ffff;" textFill="#280c0c">
         <font>
            <Font size="25.0" />
         </font></JFXButton>
      <JFXTextField fx:id="textField" layoutX="233.0" layoutY="24.0" promptText="Enter UserName" />
   </children>
</AnchorPane>

该问题已在JFoenix的问题跟踪系统中报告:

首先,JFoenix并没有真正为Java11+做好准备。发布的版本是针对Java9的,但是如果您添加JavaFX依赖项,它仍然适用于Java11和JavaFX11

但是,在JDK12下,它无法运行,并且问题与JavaFX无关:即使使用JavaFX11.0.2,它仍然会失败

此问题与使用访问
TextFieldSkin
Text
节点有关:

textNode = ReflectionHelper.getFieldContent(TextFieldSkin.class, this, "textNode");
或者,仍然依赖于反思,但有适当的变化:

try {
    Field field = cls.getDeclaredField(fieldName);
    field.setAccessible(true); // <-- Use this.
    return (T) field.get(obj);
} catch (Throwable ex) { }

您使用的是哪个jfoenix版本?我使用的是9.0.8版本@JoséPeredaYou应该能够通过
——添加opens javafx.controls/javafx.scene.control.skin=com.jfoenix
打开javafx.scene.control.skin包,通过com.jfoenix模块中的代码进行深度反射。但是,在这个库的维护人员解决问题之前,这只是一个解决办法。不清楚为什么这里引用JDK-8221530-这个问题是关于JNI代码,堆栈上没有java框架,试图调用调用调用方敏感方法。在上面,似乎有java堆栈框架。@AlanBateman我正在试图找到一个发行说明,解释JDK 11.0.2和12.0.1之间的区别,与
反射
和/或
不安全
有关。这是现在不起作用的方法。有什么提示吗?如果我读对了代码,那么它试图使用不安全的方法来攻击java.lang.reflect.field中的私有/未记录字段。这种攻击在最近的JDK版本中不起作用。他们应该替换setAccessible方法来调用obj.setAccessible(true),这样当库试图破解无法访问的内部构件时,用户就可以获得正确的异常。如果您这样做,那么用户就可以使用--add exports或--add opens选项来解决这些问题,直到库的维护人员解决他们的问题。是的,这正是他们正在做的,您的评论完全有意义,但这取决于他们。您提到了“最近的JDK版本”,但是黑客仍然可以在11.0.2上使用,所以我想知道发生了什么变化(因此我可以将其添加到我的答案中)。JDK对核心反射隐藏了许多非常安全敏感的私有字段。jlr.Field中的私有字段被添加到JDK 12中的列表中。这是JFoenix维护人员需要解决的问题,因为依赖这样的黑客是荒谬的。
textNode = textPane.getChildren().get(1);
try {
    Field field = cls.getDeclaredField(fieldName);
    field.setAccessible(true); // <-- Use this.
    return (T) field.get(obj);
} catch (Throwable ex) { }
--add-exports=javafx.controls/javafx.scene.control.skin=$moduleName