1. 스위치 조건문에 문자열을 추가할 수 있습니다. 방법은 문자열의 hashcode() 값을 사용하여 실제 값을 얻는 것입니다.
2. 숫자 앞에 "0b" 또는 "0B"를 추가하여 리터럴, 바이너리로 사용할 수 있는 기본 시스템을 추가했습니다.
3. 값의 크기에 영향을 주지 않고 쉽게 읽을 수 있도록 숫자 리터럴에 밑줄을 사용하여 숫자를 구분합니다. 기본 원칙은 밑줄은 앞뒤에 숫자가 있어야만 나타날 수 있다는 것입니다.
4.java7에서는 예외에 대해 두 가지 변경 사항을 적용했습니다.
4.1. catch 절에서 여러 예외를 동시에 포착하는 것을 지원하고, 다른 하나는 예외를 포착하고 다시 발생시킬 때 예외 유형을 더 정확하게 만드는 것입니다. Java 7에서는 Throwable 클래스에 addSuppressed 메소드가 추가되었습니다. 예외가 발생하면 해당 예외로 인해 다른 예외가 억제될 수 있으므로 정상적으로 발생하지 못합니다. 이때, addSuppressed 메소드를 통해 이러한 억제된 예외를 기록할 수 있습니다. 또한 getSuppressed 메소드를 통해서도 이러한 예외를 얻을 수 있습니다. 이것의 장점은 예외가 손실되지 않아 개발자가 더 쉽게 테스트할 수 있다는 것입니다.
Java7은 catch 절의 구문을 개선하여 여러 예외를 지정할 수 있도록 합니다. 각 예외 유형은 "|"로 구분됩니다. catch 절에서 캡처된 예외는 반복되는 유형을 가질 수 없으며 예외 중 하나가 다른 예외 매개변수의 하위 클래스가 될 수 없습니다. 그렇지 않으면 컴파일 오류가 발생합니다(소문자에서 대문자로, 문제 없음). ). catch 절에 여러 예외가 선언된 경우 예외 매개변수의 특정 유형은 이러한 모든 예외 유형의 최소 상한입니다.
4.2 try(리소스 애플리케이션) {비즈니스 처리}를 사용하여 리소스를 자동으로 해제합니다. try 문으로 관리할 수 있는 리소스는 한 가지 조건을 충족해야 합니다. 즉, 해당 Java 클래스는 java.lang.AutoCloseable 인터페이스를 구현해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다. 발생합니다. 이 인터페이스의 close 메소드는 리소스를 해제해야 할 때 자동으로 호출됩니다.
5. 가변 길이 매개변수를 사용하여 메소드 호출을 최적화합니다.
j2se5.0에 도입된 새로운 기능은 메소드 선언에서 가변 길이 매개변수의 사용을 허용하는 것입니다. 메소드의 마지막 형식 매개변수는 동일한 유형의 매개변수 수를 나타내기 위해 지정될 수 있습니다. 호출되면 이러한 매개변수는 배열 형식으로 전달됩니다. 이러한 매개변수는 메소드 본문에서 배열로 참조될 수도 있습니다.
6. Java 7에는 새로운 주석 @SafeVarargs가 도입되었습니다. 개발자가 가변 길이 매개변수를 사용하는 메서드가 일반 클래스와 함께 사용될 때 유사한 상황을 일으키지 않을 것이라고 확신하는 경우 이 주석을 사용하여 선언할 수 있습니다. @SafeVarargs 주석은 가변 매개변수 길이를 가진 메서드나 생성자에서만 사용할 수 있으며 메서드는 static 또는 final로 선언되어야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다. @SafeVarargs로 주석이 달린 메소드에 대한 전제는 개발자가 이 메소드 구현 시 일반 유형 매개변수 처리가 유형 안전성 문제를 일으키지 않도록 해야 한다는 것입니다.
7.Java는 스크립트 엔진을 통해 Java 가상 머신의 일부 스크립트 언어를 지원합니다. 실제로 스크립트 엔진 관리자는 이름, 파일 확장자 및 MIME 유형으로 완성되는 세 가지 검색 엔진 방법을 지원합니다. 좋다
7.1 언어 바인딩:
스크립팅 언어 지원 API의 가장 큰 장점은 Java 언어와 스크립팅 언어 간의 상호 작용을 표준화하여 Java 언어로 작성된 프로그램이 스크립트를 사용하여 양방향 메소드 호출 및 데이터 전송을 수행할 수 있다는 것입니다. 데이터 전송은 언어 바인딩 개체를 통해 수행됩니다. 소위 언어 바인딩 개체는 공유해야 하는 데이터를 저장하고 가져오는 데 사용되는 간단한 해시 테이블입니다. 모든 데이터는 이 해시 테이블의 항목에 해당하며 간단한 이름-값 쌍입니다. javax.script.Bingings 인터페이스는 java.util.Map 인터페이스에서 상속되는 언어 바인딩 개체의 인터페이스를 정의합니다. 스크립트 엔진은 실행 중에 여러 언어 바인딩 개체를 사용할 수 있습니다. 언어마다 바인딩 개체의 범위가 다릅니다. 기본적으로 스크립트 엔진은 실행 중에 생성된 전역 개체를 저장하기 위해 여러 언어 바인딩 개체를 제공합니다. ScriptEnging 클래스는 스크립트 엔진에서 특별히 사용되는 기본 언어 바인딩 개체에 대해 작동하기 위한 put 및 get 메서드를 제공합니다. 프로그램은 이 기본 언어 바인딩 개체를 직접 사용하거나 자체 언어 바인딩 개체를 사용할 수 있습니다. 스크립트 실행 중에 언어 바인딩 개체는 추가 변수 매핑 테이블로 간주될 수 있습니다. 변수 값을 구문 분석할 때 언어 바인딩 개체의 이름도 고려됩니다. 스크립트 실행 중에 생성된 전역 변수 및 기타 콘텐츠는 언어 바인딩 개체에 나타납니다. 이러한 방식으로 Java와 스크립팅 언어 간의 양방향 데이터 전송이 완료됩니다.
예를 들어, "name"이라는 문자열이 ScriptEngine의 put 메소드를 통해 스크립트 엔진의 기본 언어 바인딩 개체에 추가된 다음 해당 개체는 스크립트에서 이름으로 직접 참조됩니다. 마찬가지로, 스크립트에서 생성된 전역 변수 "message"도 ScriptEnging의 get 메소드를 통해 얻을 수 있습니다. 이를 통해 Java 프로그램과 스크립트 간의 양방향 데이터 전송이 가능해집니다. 데이터 전송 중 유형 변환은 스크립트 엔진에 의해 완료되며 변환 규칙은 특정 언어의 문법에 따라 다릅니다.
대부분의 경우 ScriptEnging의 put 및 get 메소드를 사용하는 것으로 충분합니다. put 및 get 메소드만 사용되는 경우 언어 바인딩 객체 자체는 개발자에게 투명합니다. 어떤 경우에는 프로그램 자체의 언어 바인딩 개체를 사용해야 합니다. 예를 들어, 언어 바인딩 개체에는 프로그램 고유의 데이터가 포함되어 있습니다. 자체 언어 바인딩 개체를 사용하려는 경우 스크립트 엔진의 creatBingings 메서드를 호출하거나 javax.script.SimpleBingings 개체를 생성하여 다음과 같이 스크립트 엔진의 eval 메서드에 전달할 수 있습니다.
eval 메소드를 통해 전달된 언어 바인딩 개체는 현재 평가 호출에만 적용되며 엔진의 기본 언어 바인딩 개체를 변경하지 않습니다.
7.2 스크립트 실행 컨텍스트 스크립트 엔진 실행과 관련된 또 다른 중요한 인터페이스는 javax.script.ScriptContext이며, 이는 스크립트 엔진 실행 중 관련 컨텍스트 정보를 포함하며 JavaEE의 서블릿 사양에 있는 javax.servlet.ServletContext 인터페이스와 비교할 수 있습니다. . 스크립트 엔진은 컨텍스트 개체를 참조하여 스크립트 실행과 관련된 정보를 얻고, 개발자가 이 개체를 통해 스크립트 엔진의 동작을 구성할 수도 있습니다. 상위 및 하위 개체에는 주로 다음 세 가지 유형의 정보가 포함됩니다.
7.2.1 입력 및 출력 먼저 스크립트가 실행 중 입력된 데이터를 읽어들이기 위해 사용하는 java.io.Reader 객체와 올바른 내용을 출력하는 java.io.Writer 등 스크립트 입력 및 출력과 관련된 구성 정보를 소개합니다. 오류 정보. 기본적으로 스크립트의 입력과 출력은 표준 콘솔에서 발생합니다. 스크립트의 출력을 파일에 쓰려면 다음 코드를 사용할 수 있습니다. setWriter 메소드를 통해 스크립트 출력을 파일로 리디렉션합니다. ScriptContext의 setReader, setErrorWriter 메소드를 통해 스크립트 실행 시 데이터 입력 소스와 오류 발생 시 오류 메시지의 출력 대상을 각각 설정할 수 있습니다.
7.2.2 사용자 정의 속성
ScriptContext에는 ServletContext와 유사한 속성(즉, setAttribute 및 getAttribute)을 가져오고 설정하는 메소드도 있습니다. 차이점은 ScriptContext의 속성은 범위가 지정된다는 것입니다. 서로 다른 범위 간의 차이점은 검색 순서입니다. 각 범위는 해당 정수를 사용하여 검색 순서를 나타냅니다. 정수값이 작을수록 검색순서에서 우선순위가 높아집니다. 우선 순위가 높은 범위의 속성은 우선 순위가 낮은 범위에서 동일한 이름을 가진 속성을 숨깁니다. 따라서 속성을 설정할 때 범위를 명시적으로 지정해야 합니다. 속성을 가져올 때 지정된 범위에서 검색하도록 선택하거나 범위 우선순위에 따라 자동으로 검색하도록 선택할 수 있습니다.
그러나 스크립트 실행 컨텍스트 구현에 포함되는 범위는 고정되어 있습니다. 개발자는 자신의 범위를 자유롭게 정의할 수 없습니다. 사용 가능한 모든 범위 목록은 ScriptContext의 getScopes 메서드를 통해 얻을 수 있습니다. SciptContext에는 두 가지 범위가 미리 정의되어 있습니다. 상수 ScriptContext.ENGINE_SCOPE로 표시되는 범위는 현재 스크립트 엔진에 해당하고, ScriptContext.GLOBAL_SCOPE로 표시되는 범위는 동일한 엔진 팩토리에서 생성된 모든 스크립트 엔진 개체에 해당합니다. 전자가 우선순위가 더 높습니다. 예를 들어:
7.2.3 언어 바인딩 객체
스크립트 실행 컨텍스트의 최종 정보 유형은 언어 바인딩 개체입니다. 언어 바인딩 개체도 범위에 해당합니다. 언어 바인딩된 개체에는 동일한 범위 우선 순위가 적용됩니다. 이 우선순위 순서는 스크립트 실행 중 변수 해결에 영향을 미칩니다. 예를 들어:
바인딩.put("이름","세계")
engine.eval("println(이름);");
7.3 스크립트 편집:
스크립팅 언어는 일반적으로 해석되고 실행됩니다. 스크립트 엔진은 런타임에 스크립트를 실행하기 전에 스크립트를 구문 분석해야 합니다. 일반적으로 해석을 통해 스크립트를 실행하는 것은 컴파일 후에 실행하는 것보다 느립니다. 스크립트를 여러 번 실행해야 하는 경우 스크립트를 먼저 컴파일할 수 있습니다. 컴파일된 스크립트는 실행 시 반복적으로 구문 분석할 필요가 없으므로 실행 효율성을 높일 수 있습니다. 모든 스크립트 엔진이 스크립트 컴파일을 지원하는 것은 아닙니다. 스크립트 엔진이 이 기능을 지원하는 경우 이를 선언하기 위해 javax.script.Compilable 인터페이스를 구현합니다. 스크립트 엔진 사용자는 이 기능을 활용하여 여러 번 실행해야 하는 스크립트의 효율성을 향상시킬 수 있습니다. Java SE와 함께 제공되는 JavaScript 스크립트 엔진은 스크립트 컴파일을 지원합니다.
다음 코드에서는 Compilable 인터페이스의 compile 메소드를 사용하여 스크립트 코드를 컴파일하고 컴파일 결과를 javax.script.CompiledScript로 표현합니다. 모든 스크립트 엔진이 Compilable 인터페이스를 지원하는 것은 아니므로 여기에서는 판단을 위해 instanceof를 사용해야 합니다. run 메소드에서는 CompiledScript의 eval 메소드를 통해 스크립트를 실행할 수 있습니다. 코드에서는 스크립트를 100번 반복 실행하여 반복 실행 시 컴파일된 스크립트의 성능 이점을 보여줍니다.
public void run(String scriptText)은 ScriptException을 발생시킵니다.
CompiledScript 스크립트 = compile(scriptText);
if (스크립트 == null) {
반품;
}
for (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 스크립트의 메소드 호출 스크립트에서 가장 일반적이고 실용적인 것은 메소드입니다. 일부 스크립트 엔진에서는 사용자가 스크립트의 메서드를 개별적으로 호출할 수 있습니다. 이 메소드 호출을 지원하는 스크립트 엔진은 javax.script.Invocable 인터페이스를 구현할 수 있습니다. Invocable 인터페이스를 통해 스크립트의 최상위 메서드와 개체의 멤버 메서드를 호출할 수 있습니다. 스크립트의 최상위 메소드나 객체의 멤버 메소드가 인터페이스를 Java로 구현하는 경우 Invocable 인터페이스의 메소드를 통해 스크립트의 해당 Java 인터페이스의 구현 객체를 얻을 수 있습니다. 이러한 방식으로 인터페이스를 Java 언어로 정의하고 스크립트로 구현할 수 있습니다. 인터페이스를 사용하는 프로그램의 다른 부분은 인터페이스가 스크립트에 의해 구현된다는 사실을 모릅니다. Compilable 인터페이스와 마찬가지로 ScriptEngine의 Invocable 인터페이스 구현도 선택 사항입니다.
다음 코드는 Invocable 인터페이스의 InvokeFunction을 통해 스크립트의 최상위 메소드를 호출합니다. 호출 중 매개변수는 스크립트의 메소드에 전달됩니다. JavaSE와 함께 제공되는 JavaScript 스크립트 엔진은 Invocable 인터페이스를 구현하므로 엔진이 Invocalbe 인터페이스를 구현하는지 여부에 대한 판단은 여기서 생략됩니다. Java에서 스크립트의 최상위 메소드를 호출하는 예입니다.
//Java에서 스크립트 객체의 멤버 메소드를 호출하는 예
7.5 스크립트에 자바 인터페이스 구현하기
일부 스크립트 엔진에서는 인터페이스를 Java 언어로 정의하고 인터페이스 구현을 스크립트로 작성할 수 있습니다. 이러한 방식으로 프로그램의 다른 부분은 Java 인터페이스와만 상호 작용할 수 있으며 신경 쓸 필요가 없습니다. 인터페이스가 어떻게 구현되는지. 다음 코드에서 Greet은 getGreeting 메소드를 포함하는 Java로 정의된 인터페이스입니다. 스크립트에서 이 인터페이스를 구현합니다. getInterface 메소드를 통해 스크립트에 의해 구현된 인터페이스의 객체를 가져오고 그 안에 있는 메소드를 호출할 수 있습니다.
스크립트 언어의 구문은 간단하고 유연하기 때문에 프로그래밍 배경 지식이 없거나 적은 사용자에게 매우 적합합니다. 이러한 사용자는 스크립트 언어를 사용하여 프로그램의 비즈니스 로직과 사용자 인터페이스를 사용자 정의할 수 있습니다. 언어는 프로그램의 사용 편의성을 향상시킬 수 있으며 유연성과 유연성 사이에서 더 나은 균형을 이룰 수 있습니다. 예를 들어, 스크립팅 언어 Lua는 게임 개발에서 게임의 내부 동작과 사용자 인터페이스를 사용자 정의하는 데 널리 사용됩니다.
8. 리플렉션 API는 Java 프로그램에 유연성을 제공하지만 리플렉션 API의 구현 메커니즘으로 인해 추가 성능 비용도 발생합니다. 메서드 호출과 같은 동일한 작업의 경우 리플렉션 API를 사용하여 동적으로 구현하는 것이 더 빠릅니다. 코드가 작성되는 방식은 소스에서 직접 실행하는 것보다 1~2배 정도 느릴 수 있습니다. JVM(Java Virtual Machine) 구현이 개선되면서 리플렉션 API의 성능이 크게 향상되었습니다. 그러나 이러한 성능 격차는 객관적으로 존재합니다. 따라서 상대적으로 높은 성능 요구 사항이 있는 일부 애플리케이션에서는 리플렉션 API를 주의해서 사용해야 합니다.