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.
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)
Commençons par un aperçu de l'examen.
||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.
--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é.
--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é.
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.
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.
À 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.
À 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.
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.
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.
J'ai procédé à l'apprentissage en me référant à la page Oracle suivante.
À 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.
En décrivant les dépendances module par module, il est désormais possible de décrire simplement les dépendances entre les packages.
É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.
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.
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.
}
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.
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
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:
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:
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 |
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
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
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
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
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 = '
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.
** 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.
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.
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.
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
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
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.
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