Nouveaux sujets de l'examen Java SE 11 Programmer II

À propos de cet article

J'ai passé et réussi l'examen * Java SE 11 Programmer II * le 16 mai 2020 et j'ai obtenu les qualifications * Java Programmer, Gold SE 11 . J'ai décidé d'écrire. Je n'ai pas vraiment compris les nouvelles fonctionnalités moi-même, donc je les passe également en revue. Comme prémisse, j'ai des qualifications * Java Programmer, Silver * ( Java SE 11 Programmer II *), et je partirai du principe que j'ai acquis des connaissances sur * Java SE 8 Gold *. Je ne parlerai pas beaucoup des API Core telles que les expressions lambda et les API Stream, mais j'écrirai principalement sur les nouveaux éléments ajoutés à partir de SE 8. Cet article n'est qu'une brève explication, veuillez donc consulter les liens dans chaque élément pour plus de détails.

introduction

L'entreprise pour laquelle je travaille dispose d'une allocation de qualification et j'étudiais pour obtenir des qualifications pour apprendre Java et obtenir une allocation de qualification. * Java SE 7/8 Bronze * et * java SE 8 Silver * (* Java SE 8 Programmer I *) étaient tous deux relativement faciles à obtenir après avoir résolu le livre noir pendant quelques semaines. Après avoir étudié l'or pendant environ deux mois, j'ai réussi à passer SE 8 mais je voulais obtenir la dernière qualification si je voulais obtenir la qualification la plus élevée, alors j'ai décidé de passer SE 11 Fait. Cependant, l'ouvrage de référence n'a pas été publié au 16 mai 2020 et il est prévu que cela prendra un certain temps avant sa publication. J'ai donc dû étudier de nouveaux domaines à partir de SE 11 sans me fier aux ouvrages de référence, ce qui était assez difficile. Des informations approximatives ont été recueillies en participant à un séminaire en ligne gratuit organisé par Oracle. Le questionneur était l'instructeur et l'histoire était facile à comprendre, donc elle était très significative. Si j'en ai l'occasion, je pense qu'il n'y a aucune perte à suivre le cours. De plus, si vous passez l'examen avant le 31 mai, nous lançons une campagne où vous pouvez repasser l'examen gratuitement, donc en cas de doute, vous voudrez peut-être le repasser une fois. Les détails peuvent être trouvés dans les liens ci-dessous.

[Campagne :: Oracle :: Pearson VUE] (https://www.pearsonvue.co.jp/Clients/Oracle/Special-Offers/Retake2020.aspx)

Aperçu de l'examen

Commençons par un aperçu de l'examen.

Java SE 11 Programmer II | Oracle University

||Java SE 11 Programmer II|Java SE 8 Programmer II| |:-:|:-:|:-:| |Nom de l'examen|Java SE 11 Programmer II|Java SE 8 Programmer II| |Numéro d'examen|1Z0-816|1Z0-809| |Frais d'examen(Taxe non comprise)|¥26,600|¥26,600| |Format des questions|Question de choix|Question de choix| |temps de test|180 minutes|150 minutes| |Nombre de questions|80 questions|85 questions| |Ligne de passage|63%|65%|

Le nombre de questions a un peu diminué et la durée des examens a augmenté. Il semble que le code de l'énoncé du problème soit globalement un peu plus long. Le nombre de lignes de dépassement a légèrement diminué, mais je pense que c'est parce qu'il s'agit d'une nouvelle qualification. Cela a pris environ 30 minutes dans la production réelle, donc je ne pense pas qu'il soit nécessaire de se précipiter pour le résoudre.

Différences dans la plage de questions

Sujet nouvellement ajouté

--Méthode d'interface privée --Utilisation de l'inférence de type de variable locale (var) --Fonction de module

Les sujets nouvellement ajoutés se sont concentrés sur la fonctionnalité du module et le codage sécurisé.

Sujets sur lesquels se concentrer

--Srialisation --Génériques

Le ratio de sérialisation est plus élevé que vous ne le pensez, alors assurez-vous de bien le comprendre. Concernant JDBC, il existe également des problèmes liés aux contre-mesures d'injection SQL liées au codage sécurisé. Expression Lambda, l'API Stream est le sujet le plus important comme SE 8, et le ratio de questions est assez élevé.

Sujets qui ne sont plus disponibles

On m'a dit que l'API Date and Time n'apparaissait pas lors du séminaire, mais une seule question a soulevé un problème de format. Il semble préférable d'apprendre uniquement les bases. En ce qui concerne le modèle de conception, le modèle Singleton peut être demandé en relation avec un codage sécurisé tel que le contrôle de synchronisation.

Environnement d'exécution Java SE 11

Installation standard de Pleiades Java 11 et fin du nom de code Eclipse

Il existe un ensemble complet de ** Pléiades All In One ** que vous pouvez télécharger à partir du lien, c'est donc le meilleur si vous souhaitez l'utiliser rapidement.

Méthode privée d'interface

À partir de Java 9, vous pouvez définir des ** méthodes privées ** dans vos interfaces. Il est utilisé pour une utilisation dans les méthodes statiques et les méthodes par défaut dans la même interface, a une implémentation et ne peut pas être hérité ou appelé à partir de classes externes.

SampleInterface.java


public interface SampleInterface{
    default void defaultMethod(){
        privateMethod("Taro");
        privateMethod("Jiro");
    }

    static void staticMethod(){
        privateStaticMethod("Saburo");
        privateStaticMethod("Shiro");
    }

    private void privateMethod(String name){
        System.out.println( "Bonjour," + name + "M.");
    }
    
    private static void privateStaticMethod(String name){
        System.out.println( "Bonjour," + name + "M.");
    }
}

SampleClass.java


public class SampleClass implements SampleInterface{
	public static void main(String[] args) {
		SampleClass sc = new SampleClass();
		sc.defaultMethod();
		SampleInterface.staticMethod();
	}
}

Résultat d'exécution


Salut, Taro
Salut, Jiro
Salut, Saburo
Salut, Shiro

De cette façon, lors de l'écriture d'un traitement similaire dans une interface, vous pouvez l'écrire de manière concise sans écrire plusieurs fois le même code.

Utilisation de l'inférence de type de variable locale (var)

À partir de Java 10, l'inférence de type à l'aide de var pour les variables locales est disponible. Le type est automatiquement déduit du côté droit lorsque la variable est affectée.

Exemple d'utilisation

LocalVariableType.java


public class LocalVariableType {
	public static void printInt(int i) {
		System.out.println(i + " is int type");
	}

	public static void printBoolean(boolean bl) {
		System.out.println(bl + " is boolean type");
	}

	public static void printString(String str) {
		System.out.println(str + " is String type");
	}

	public static void main(String[] args) {
		var i = 1;
		var bl = true;
		var str = "String";
		printInt(i);//Fonction qui prend un argument de type int
		printBoolean(bl);//Fonction qui prend un argument de type booléen
		printString(str);//Fonction qui prend un argument de type String

		//Peut également être utilisé dans List et pour les instructions
		var list = List.of(i,bl,str);
		for(var l :list) {
			System.out.print(l + " ");
		}
		//À partir de Java 11, var peut être utilisé comme argument pour les expressions lambda, ce qui lui permet d'être annoté.
		Function<String,Integer> function = (@Annotation var a) -> a.length();
	}
}

Résultat d'exécution


1 is int type
true is boolean type
String is String type
1 true String 

Comme avec JavaScript, vous pouvez voir que l'inférence de type peut maintenant être effectuée à partir du côté droit. L'inférence de type de liste peut omettre la description des génériques, donc je pense qu'il sera plus facile de voir avec moins de code.

Exemple d'erreur de compilation

Si le type ne peut pas être déduit du côté droit, une erreur de compilation se produira.

LocalVariableType2


public class LocalVariavleType2 {
	public static void main(String[] args) {
		var v;//Doit être initialisé au moment de la déclaration
		var f1 = a -> a + 1;	//Les expressions Lambda ne peuvent pas être attribuées
		var f2 = (Runnable)() -> new String("Hello");//Peut être initialisé en castant une interface fonctionnelle
		var list1 = {1, 2, 3};//Ne peut pas être utilisé pour initialiser un tableau
		var list2 = new int[]{1, 2, 3};//Peut être initialisé en spécifiant le type
		var list3 = new ArrayList<>();//Compilable, mais de type ArrayList<Object>devenir
		var n = null;//nul ne peut être attribué
	}
}

Je n'ai posé que deux questions directement sur la façon d'utiliser var, mais il est pris pour acquis qu'il est écrit dans le code de l'énoncé du problème, alors comprenons la signification.

Fonction du module

J'ai procédé à l'apprentissage en me référant à la page Oracle suivante.

Comprendre les modules Java 9

Qu'est-ce qu'un module?

À partir de Java 9, les fonctions du module sont disponibles. Un module est un concept supérieur de package, qui est une collection de packages, de ressources et de descripteurs de module associés. Les bibliothèques de base telles que java.lang sont également stockées dans le module java.base. Ce module java.base est accessible sans utiliser de descripteurs de module tels que le mot clé requires décrit ci-dessous.

Avantages de la modularisation

Simplification des dépendances

En décrivant les dépendances module par module, il est désormais possible de décrire simplement les dépendances entre les packages.

Encapsulation forte

Étant donné que vous pouvez spécifier plus en détail l'autorité d'accès pour les packages subordonnés, une encapsulation plus forte est possible.

L'environnement d'exécution peut être personnalisé pour chaque module

En créant un runtime avec uniquement les modules dont vous avez besoin, vous pouvez réduire la taille du runtime et améliorer l'efficacité de l'optimisation JVM.

Définition du module

Vous pouvez définir un module en plaçant le fichier de définition de module suivant en haut du dossier source. Le nom du module doit être dans le domaine inverse et unique (ne peut pas contenir le même nom).

module-info.java


module Java_SE_11_Gold {
//Décrivez le descripteur de module, etc.
}

Descripteur de module

requires

module-info.java


module A {
	requires B;
}

Un descripteur qui indique que le module dépend d'un autre module. Pour le code ci-dessus, le module A lit le module B. requires transitive

module-info.java


module A {
	requires B;
}
module B{
	requires transitive java.sql;
}

Permet la lecture du module spécifié lorsque le module qui décrit le descripteur transitif requis est lu lors de la lecture du module spécifié. Pour le code ci-dessus, le module B lit java.sql. Le module A lit également le module B, mais à ce moment-là, le module A lit également java.sql en même temps. Si vous utilisez simplement requires dans le module B, le module A ne pourra pas charger java.sql. requires static L'existence du module n'est requise qu'au moment de la compilation. Non requis au moment de l'exécution. C'est juste une imagination, mais je pense que c'est utilisé pour les annotations. exports

module-info.java


module A{
	exports samplePackage;
	exports samplePackage2 to B,C;
}

Les packages suivants ne sont pas accessibles de l'extérieur par défaut. Utilisez le descripteur d'exportations pour autoriser l'accès depuis l'extérieur du module. Si vous exportez, autorisez l'accès aux types publics (et aux types publics et protégés imbriqués). Dans le code ci-dessus, le package samplePackage est spécifié pour être accessible de l'extérieur. Vous pouvez également spécifier les packages auxquels vous souhaitez autoriser l'accès en utilisant le descripteur exports ... to (plusieurs spécifications peuvent être spécifiées séparées par des virgules). Le code ci-dessus permet au module B et au module C d'accéder au package samplePackage2. opens Il ne peut pas être référencé au moment de la compilation, mais il peut être contrôlé pour pouvoir être référencé au moment de l'exécution. Il existe deux types: ouvre ... à, qui est défini pour chaque package, et module ouvert, qui est défini pour l'ensemble du module.

mojule-info.java


module Java_SE_11_Gold{
	opens samplePackage;//Rend le package spécifié visible par tous les modules
	opens aamplePackage2 to B,C;//Vous pouvez spécifier individuellement plusieurs modules cibles à ouvrir séparés par des virgules.
}

mojule-info.java


open module Java_SE_11_Gold{//Rendre possible de se référer à tous les modules subordonnés
}

uses Spécifie le service utilisé par le module. Un service est un ensemble d'interfaces et de classes connues (généralement des classes abstraites). Voir le lien vers javadoc ci-dessous pour plus d'informations. https://docs.oracle.com/javase/jp/8/docs/api/java/util/ServiceLoader.html provides...with Spécifie que le module fournit une implémentation du service. Après fournit, spécifiez l'interface ou la classe petite et moyenne à fournir aux utilisations, puis avec, spécifiez le nom de la classe qui implémente l'interface ou hérite de la classe abstraite.

Modules anonymes et automatiques

Les modules anonymes et automatisés sont des modules spécialisés principalement destinés à appliquer des systèmes de modules au code pré-Java 8. Ici, nous expliquerons les parties susceptibles d'être impliquées dans l'examen, donc si vous voulez en savoir plus, veuillez vous référer au lien ci-dessous. Apprenez le système de modules

Module anonyme

Les packages et les types chargés à partir du chemin de classe appartiendront désormais à un module appelé * Module anonyme *. Les modules anonymes ne peuvent pas avoir de définition de module (module-info.java), ils ne peuvent donc pas utiliser de descripteurs de module pour décrire les dépendances, mais ils se comportent implicitement comme suit:

Module automatique

Un module pour traiter les non-modules comme des modules. Le code qui n'a pas de définition de module sera reconnu comme un module automatique. Comme les modules anonymes, vous ne pouvez pas définir explicitement un descripteur de module, et il se comporte implicitement comme suit:

Référencabilité entre les modules

Un module nommé est un module régulier qui a une définition de module. De plus, la commande --add-module est une commande qui vous permet d'ajouter n'importe quel module au module racine. Dans le tableau ci-dessous, les types de modules référencés par le côté marqué (référencé) et les modules référencés par l'autre côté sont indiqués.

Module nommé(Référencé) Module automatique(Référencé) Module anonyme(Référencé) traits
Module nommé Peut être référé Peut être référé Ne peut pas être référencé Il y a une définition de module et elle est placée dans le chemin du module
Module automatique --add-Peut être référencé à l'aide de la commande module Peut être référé Peut être référé Aucune définition de module, placée dans le chemin du module
Module anonyme --add-Peut être référencé à l'aide de la commande module --add-Peut être référencé à l'aide de la commande module Peut être référé Aucune définition de module, placée dans le chemin de classe

Classe ServiceLoader

Cette classe s'appelle SPI (Survice Provider Interface) et gère un mécanisme permettant à des tiers de fournir des implémentations. La bibliothèque fournit des services qui sont des SPI (un ensemble d'interfaces et de classes (généralement des classes abstraites)), et le chargeur de services charge l'implémentation tierce. Pour des spécifications et des méthodes détaillées, reportez-vous aux documents Oracle suivants. ServiceLoader (Java Platform SE 8 ) - Oracle Docs

Comment utiliser jdeps

Vous pouvez utiliser la commande jdeps pour savoir de quel module dépend le fichier jar (ou le fichier de classe), comme indiqué ci-dessous.

jdeps -fichier jar
(nom de fichier jar) -> (Nom du module dépendant)
(nom de fichier jar) -> (Nom du module dépendant)
(nom de fichier jar) -> (Nom du module dépendant)
……

-s est une option pour imprimer un résumé des dépendances. Les options sont détaillées sur la page de documentation Oracle suivante. Imprimer les résumés -s et -summary, imprimer les dépendances -v et -verbose, spécifier les dépendances dans le package spécifié -p et -package , modèle d'expression régulière spécifié Je me souviens avoir eu des problèmes avec -e <modèle d'expression régulière> et -regex <modèle d'expression régulière>, qui recherchent les dépendances dans les packages qui correspondent. Si aucune option n'est spécifiée, l'option -verbose: package, qui génère par défaut les dépendances entre les packages, est utilisée. Pour plus d'informations, consultez la documentation Oracle ci-dessous. jdeps - Oracle Docs

Pour un exemple de fonctionnement concret de chaque commande, reportez-vous aux liens ci-dessous. Essayez l'outil d'analyse des dépendances jdeps fourni avec Java 8

Codage sécurisé

Dans le domaine du codage sécurisé, il y a des questions sur la façon de prévenir les fuites de données et la falsification lors de l'échange de données importantes telles que les numéros de carte de crédit, et comment empêcher les attaques telles que l'injection SQL par des attaquants malveillants. .. Si vous pensez dans le bon sens, il y a des problèmes qui peuvent être résolus sans beaucoup de connaissances, donc je pense que ce sera une catégorie relativement facile dans le nouveau domaine. Lors du séminaire Oracle, les liens JPCERT suivants "00. Input Value Inspection and Data Detoxification (IDS)", "12. Input / Output (FIO)", "13. Serialization (SER)", "14. Platform Il y avait des informations selon lesquelles les questions seront posées à partir de «Sécurité (SEC)» et «49. Règles diverses (MSC)». Java Coding Standard CERT / Oracle Version Les principaux problèmes sont l'injection SQL, l'encapsulation et la sérialisation. C'est une bonne idée de comparer le code de conformité avec le code de violation dans le lien ci-dessus pour comprendre ce qui ne va pas. En outre, comme condition préalable, il est bon de comprendre la méthode d'attaque de base pour les sites Web. Les liens ci-dessous décrivent chaque méthode d'attaque. Types de cyberattaques et sécurité Web

Contrôle de la valeur d'entrée

En vérifiant la valeur d'entrée, vous pouvez empêcher l'injection SQL et XSS (cross-site scripting). Par exemple, considérez la requête suivante.

SELECT * FROM db_user WHERE username='<USERNAME>' AND password='<PASSWORD>'

Étant donné "username'or '1' = '1" comme nom d'utilisateur, cette requête ressemble à ceci:

SELECT * FROM db_user WHERE username='Nom d'utilisateur' or '1'='1' AND password='<PASSWORD>'

À l'origine, le nom d'utilisateur et le mot de passe sont vérifiés, mais en réécrivant la requête de cette manière, "username = 'username'" ou "'1' = '1' AND password = ''" Si l'un ou l'autre est vrai, vous pourrez accéder à l'enregistrement. En d'autres termes, dans ce cas, vous pouvez accéder à l'enregistrement en entrant simplement le nom d'utilisateur quelle que soit la valeur saisie du mot de passe. Pour éviter cela, il est nécessaire de vérifier si la valeur d'entrée contient des symboles ou des caractères spécifiques et si elle est plus longue que nécessaire. Si vous souhaitez prendre des mesures contre l'injection SQL, vous pouvez également utiliser PreparedStatement pour construire SQL.

Entrée / sortie de fichier

Fondamentalement, la question est de savoir si le fichier est correctement fermé. Si le fichier n'est pas fermé, il perdra de la mémoire et consommera des ressources. Comme méthode de fermeture du fichier, il existe une méthode d'utilisation de l'instruction try-with-resource et une méthode d'utilisation de la méthode close (). De plus, lors de la sortie d'un fichier, il est judicieux d'effectuer une copie complète en lecture seule afin que les données d'origine ne soient pas modifiées.

Sérialisation

** Serialize ** consiste à générer une instance Java sous forme de chaîne d'octets et à l'enregistrer. Inversement, l'opération de conversion d'une chaîne d'octets en instance Java est appelée ** désérialisation **. Il est principalement utilisé pour stocker une instance de Java dans un fichier et rendre les informations de l'instance persistantes. Puisqu'il est dans la plage de * SE 8 *, une explication détaillée est omise et seule la partie liée au codage sécurisé est expliquée.

Compatibilité lors de la sérialisation

Si vous modifiez les champs de la classe sérialisée, il peut y avoir un conflit entre l'instance restaurée lorsque la sérialisation est restaurée et la classe modifiée. Pour éviter cela, attribuez une valeur à serialVersionUID et modifiez cette valeur chaque fois qu'il y a une modification. Le serialVersionUID doit avoir un modificateur final afin que sa valeur ne change pas. En outre, en utilisant le modificateur statique et le modificateur transitoire, vous pouvez spécifier les champs qui ne sont pas sérialisés à l'avance. Cela permet d'améliorer la compatibilité lorsque vous apportez des modifications aux classes, etc.

En outre, lorsque des informations importantes telles que des informations de carte de crédit sont incluses dans les données à sérialiser, elles peuvent être falsifiées de manière malveillante à moins qu'un traitement tel que le cryptage ne soit effectué à l'avance.

Contrôle exclusif en traitement parallèle

Lors de l'exécution d'un traitement parallèle, un problème s'est produit pour savoir s'il était thread-safe et si un blocage ou un blocage de mensonge s'est produit. En ce qui concerne le traitement parallèle, je vais omettre une explication détaillée car il est également dans le cadre de SE 8, mais je voudrais l'expliquer car on m'a posé quelques questions sur l'impasse et le blocage de la production dans la production réelle.

Impasse

Si un thread utilise une ressource exclusive, il peut être traité en parallèle sans aucun problème en attendant qu'un autre thread libère la ressource. Le blocage est une condition dans laquelle lorsqu'un thread nécessite deux ressources ou plus, le traitement parallèle entraîne la compétition entre différents threads pour des ressources exclusives et l'arrêt de leur fonctionnement. Les solutions de contournement incluent l'ordre des verrous (par exemple, lorsqu'un thread tente d'acquérir un verrou sur une deuxième ressource ou une ressource suivante, il tente d'abord d'acquérir le verrou sur la première ressource). .. Des illustrations, des exemples de code, etc. sont décrits en détail sur ce site, veuillez donc vous y référer. À propos de Deadlock - Introduction à Java-IT Specialized

Livelock

Plusieurs threads acquièrent et libèrent des ressources partagées pour éviter les blocages, mais le temps d'attente est le même et la priorité du thread pour passer au processus suivant est inférieure à celle des autres threads. La répétition du processus qui ne se poursuit pas est appelée bloc dynamique. Pour éviter cela, utilisez un nombre aléatoire pour le temps d'attente d'un thread ou donnez la priorité à d'autres threads (comme la méthode yield). Des exemples de code, etc. sont décrits en détail sur ce site, veuillez donc vous y référer. À propos de Livelock-Nee-kun

finalement

Concernant SE 11 Gold, même s'il n'y a pas de livre de référence, si vous étudiez fermement l'ancienne gamme, je pense que vous n'aurez pas de mal à part pour des éléments complètement nouveaux comme les fonctions des modules. De plus, s'il y a des lacunes ou des omissions dans le contenu, nous vous serions reconnaissants de bien vouloir les signaler dans les commentaires.

Lien de référence

Java SE 11 Programmer II | Oracle University Comprendre les modules Java 9 Apprenez le système de modules ServiceLoader (Java Platform SE 8 ) - Oracle Docs jdeps - Oracle Docs Essayez l'outil d'analyse des dépendances jdeps fourni avec Java 8 Java Coding Standard CERT / Oracle Version Types de cyberattaques et sécurité Web À propos de Deadlock - Introduction à Java-IT Specialized À propos de Livelock-Nee-kun

Recommended Posts

Nouveaux sujets de l'examen Java SE 11 Programmer II
Parlons de l'expérience passagère de Java SE 8 Programmer II
java se 8 programmeur Ⅰ mémo
Résumé de la collecte des problèmes Java SE 8 Sliver
Nouvelles fonctionnalités de Java7 à Java8
Reçu un programmeur Java certifié Oracle, Gold SE 8
Contenu du test de l'examen Java SE Bronze
La route de JavaScript à Java
Ce que j'ai fait pour obtenir le programmeur Java certifié Oracle, Silver SE 8
Kick ShellScript sur le serveur depuis Java
À propos du nouveau modèle de version de Java @ Seki Java (20/07/2018)
J'ai essayé le nouveau yuan à Java
Accédez à l'API REST Salesforce depuis Java
Note de passage Java SE 8 Silver (Java SE 8 Programmer I)
L'histoire reçue par Java SE11 silver
Il a fallu un mois entre l'application et la prise de l'Oracle Java SE 11 Silver
[Test de qualification] (Java SE8 Gold) Évaluation et résumé de l'apprentissage
Pour devenir programmeur VB.net depuis une boutique Java
Essayez d'appeler le service CORBA depuis Spring (Java)
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
Essayez Progate Free Edition [Java II]
[Test de qualification] Résumé de la méthode d'apprentissage Java SE 8 Silver