2017-01-08 2 views
3

stackoverflow here에 같은 제목의 질문이 있지만 Java에서 이와 비슷한 작업을 수행 할 수 있는지 묻고 싶습니다.Java에서 문자열을 함수로 변환하는 방법은 무엇입니까?

나는 그 사람이 Javascript에서했던 것처럼 desmos와 비슷한 것을 만들고 싶었지만 lwjgl 2를 사용하여 Java로 만들고 싶습니다. 저는 Java에 익숙하지 않고 가능한지 알고 싶습니다. 문자열을 메서드로 변환합니다. 가능한가?

가능한 옵션을 찾았으며 자신의 Java를 만들 수 있음을 알게되었습니다 eval() 메서드. 그러나 나는 창 너비의 모든 픽셀에 대해 문자열의 x을 바꾸고 싶지 않습니다.

미리 감사드립니다.

답변

5

필요한 것은 실행 시간에 문자열로 정의 된 표현식을 평가할 수있는 엔진/라이브러리입니다. 평가 코드를 함수 호출 (예 : 람다 함수)에 랩핑하면 필요한 것을 얻을 수 있습니다.

옵션 1 :exp4j을 사용할 수 있습니다. exp4j은 실행 시간에 표현식과 함수를 평가할 수있는 작은 풋 프린트 라이브러리입니다.

Expression e = new ExpressionBuilder("3 * sin(y) - 2/(x - 2)") 
     .variables("x", "y") 
     .build() 
     .setVariable("x", 2.3) 
     .setVariable("y", 3.14); 
double result = e.evaluate(); 

옵션 2 : 다음은 그 예이다 당신은 Java's script engine를 사용할 수 있습니다. 당신은 자바 스크립트, 예를 들어, 정의 식을 평가하는 데 사용할 수 있습니다 :

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("js"); 
Object result = engine.eval("sin(1.25)"); 

옵션 3 : 기본 자바 컴파일. 이 방법을 사용하면 템플릿을 사용하여 표현식이 포함 된 클래스로 .java 파일을 생성 할 수 있습니다. Java 컴파일러를 호출하는 것보다. 이 접근 방식에는 구현에 약간의 복잡성과 초기 대기 시간 (클래스가 컴파일 될 때까지)이 있지만 성능이 가장 좋은 단점이 있습니다. 여기에 몇 가지 링크가 탐험 있습니다

주에서, 당신은 보안에 대해 생각해야 마음에 있습니다. 사용자가 보안 제한없이 평가할 수있는 코드를 입력하도록 허용하는 것은 매우 위험 할 수 있습니다.

+0

컴파일 타임 (일부 빌드 도구 플러그인 포함) 또는 런타임에 바이트 코드 생성을 통해 옵션 3을 확장 할 수 있습니다. –

+0

도움을 주셔서 대단히 감사드립니다. 당신은 세 번째 옵션을 사용할 수있는 방법에 대한 링크를 게시 할 수 있습니까? 꽤 흥미로운 것 같습니다. – odermark

+1

@odermark는 응답에 대한 링크를 추가했습니다. 나는 처음이 너에게 좋은 출발을 주어야한다고 생각한다. –

관련 문제