- Les constructeurs
- La gestion des exceptions
- Les getters et les setters
- Lecture du clavier
- Les references
- Surcharge des méthodes
- Le mot clé this
- la méthode String tostring()
- Les constructeurs
- La gestion des exceptions
- Les getters et les setters
- Lecture du clavier
- Les references
- Surcharge des méthodes
- Le mot clé this
- la méthode String tostring()
Voici le chapitre sur les classes et les objets en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
Voici le chapitre sur les classes et les objets en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
The document provides an overview of gRPC and how to set up a basic "Hello World" application with gRPC in Java. It describes creating a .proto file to define the service and messages, setting up the gRPC server to handle requests, and generating client code from the .proto file to make requests to the server. The server implementation returns a greeting message in response to the client request.
This document provides an overview of the PrimeFaces JavaServer Faces (JSF) framework. It discusses key features such as over 100 UI components, advanced user interfaces, client-side validation, theming, and integration with Java technologies like Bean Validation. Support options are also summarized, including extensive documentation, books, community support, and commercial support from PrimeTek Informatics for enterprise users.
Brett Meyer gave an overview of Hibernate ORM and JPA. He discussed that ORM maps Java objects to relational databases for persistence beyond the life of a program. JPA is the Java standard for ORM that provides portability, while Hibernate is a full-featured JPA implementation with additional native features. Hibernate allows focusing on business logic rather than data access details and provides performance, concurrency, and extensibility benefits over traditional JDBC usage.
This document provides an overview of various powerful features and capabilities of Hibernate ORM beyond basic object-relational mapping. It discusses multi-tenancy support, value generation, spatial mapping with Hibernate Spatial, auditing of historical data changes with Hibernate Envers, integration with OSGi environments using Hibernate OSGi, full-text search capabilities with Hibernate Search, and support for NoSQL databases and data validation. The presentation invites questions after discussing each topic in more depth.
This document discusses advanced querying in Spring Data, including query methods, JPQL, and advanced repositories. It covers query methods that allow defining queries directly in repository interfaces, JPQL for executing SQL-like queries, and advanced features like repository inheritance and custom implementations. The document also addresses Spring configuration using Java-based configuration and application properties files.
Thymeleaf is a view engine that allows working with variables, forms, and conditional statements in views. Spring controllers are annotated with @Controller and actions are mapped to routes. Controllers have access to the HTTP request and session, and can pass data to views or redirect with parameters.
Spring Security is a framework that focuses on providing both authentication and authorization. It intercepts requests, validates credentials against a database, and validates roles for authorization. Thymeleaf Security provides functionality to display data based on authentication rules, such as showing content to administrators based on their roles or displaying the logged in username using the principal object.
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...Horgix
This is the slide deck of a talk by Alexis "Horgix" Chotard and Laurentiu Capatina presented at the MongoDB Paris User Group in June 2024 about the feedback on how PayFit move away from a monolithic hell of a self-hosted MongoDB cluster to managed alternatives. Pitch below.
March 15, 2023, 6:59 AM: a MongoDB cluster collapses. Tough luck, this cluster contains 95% of user data and is absolutely vital for even minimal operation of our application. To worsen matters, this cluster is 7 years behind on versions, is not scalable, and barely observable. Furthermore, even the data model would quickly raise eyebrows: applications communicating with each other by reading/writing in the same MongoDB documents, documents reaching the maximum limit of 16MiB with hundreds of levels of nesting, and so forth. The incident will last several days and result in the loss of many users. We've seen better scenarios.
Let's explore how PayFit found itself in this hellish situation and, more importantly, how we managed to overcome it!
On the agenda: technical stabilization, untangling data models, breaking apart a Single Point of Failure (SPOF) into several elements with a more restricted blast radius, transitioning to managed services, improving internal accesses, regaining control over risky operations, and ultimately, approaching a technical migration when it impacts all development teams.
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
3. A l’exécution
Les types sont pour le compilateur, ils ne sont
pas présent à l’exécution
A l’exécution, on ne manipule que des valeurs
●
Une valeur est un type primitif ou une référence (une
adresse)
●
Un CPU ne connait que u32, u64, f32, f64
– boolean/char/short/int → u32, float → f32, long → u64, double →
f64
– Une référence est soit un u32 soit un u64
(Compressed Pointer)
4. Où sont les valeurs à l’exécution
Stockage des valeurs
Une variable locale est un décalage par rapport à
l’addresse de base d’un appel de fonction sur la pile
Un champ est un décalage par rapport à l’adresse
d’un objet dans le tas
●
Un champ statique est un décalage par rapport à
l’adresse de la classe dans le metaspace
Une case de tableau est à l’adresse:
adresse_du_tableau + index * taille_de_élement (8,
16, 32 ou 64)
5. Description des cases mémoires
Le GC (precise algorithm)
– doit connaitre si une case mémoire (dans le tas ou la
pile) est une référence ou non
La VM utilise des méta-données
– Pour une méthode, on précalcul la pile maximale et on
retient le layout des variables locales à chaque appel
●
Pour les boucles longues, on retient le layout au niveau du
goto de retour de boucle
– Pour un objet, la classe décrit le type de chaque
champ
6. java.lang.Class
La classe à l’exécution est une structure
décrivant la classe mère, les interfaces, les
champs, les méthodes, etc
cette structure est visible comme un objet
On peut demander à chaque objet quel est
l’objet correspondant à sa classe
Class<?> Object.getClass()
7. Classe et new
La classe à l’exécution correspond à la classe
que l’on indique lors d’un new
On peut obtenir l’objet classe avec la notation
(dot class) ".class"
Object objet = new Car(…);
object.getClass() == Car.class
Object object = "hello";
object.getClass() == String.class;
8. getClass() et instanceof
Object.getClass() renvoie la classe d’un objet
L’opérateur instanceof demande si c’est “un sous-
type de”
Object o = new Car();
o instanceof Car // true
o instanceof Vehicle // true, avec Car implements Vehicle
o.getClass() == Car.class // true
o.getClass() == Vehicle.class // false
9. Class et tableau
Les tableaux en Java sont des objets, donc ils
ont une classe
– j.l.Class.isArray() est vrai
– j.l.Class.getComponentType() renvoie le type des
éléments
Les classes des tableaux n’ont pas de méthode
ni de champ
11. Java == Langage Dynamique
Comme un langage dynamique (Python, JavaScript,
Ruby, etc), Java connait la classe des objets à
l’exécution
●
donc on peut passer outre le système de typage !
On utilise les méthodes de java.lang.Class pour
dynamiquement
●
Trouver les méthodes
●
Appeler les méthodes avec les arguments
On type toutes les références comme Object
●
On converti tous les types primitifs en leur Wrapper
12. class.getMethods()
Permet d’obtenir toutes les méthodes publiques
d’un objet
– Renvoie un tableau de java.lang.reflect.Method
Par exemple,
– Method[] methods = String.class.getMethods();
...
13. j.l.r.Method
j.l.r.Method possède les méthodes
– getModifier(), getName(),
– getParameterTypes(), getReturnType()
– Object invoke(Object instance, Object… args)
et plein d’autres ...
14. java.lang.reflect.Modifier
Le “modifiers” est un int qui marche comme un
champ de bits
La classe Modifier contient plein de méthodes
statiques pour tester le “modifiers”
●
Modifier.isPublic(modifiers)/isPrivate(modifiers)
●
Modifier.isStatic(modifiers)
●
Modifier.isVarargs(modifiers),
●
...
15. Builtin java.lang.Class
La classe java.lang.Class sert aussi à
représenter le type des paramètres et type de
retour d’une méthode qui peuvent être des
types primitif ou void
La syntaxe .class marche aussi
●
sur les types primitifs: int.class
●
sur void: void.class
Ces objets indiquent qu’ils n’ont pas de
méthodes :)
16. Class.getMethod(String,Class...)
On peut demander une méthode publique
précise à partir de son nom et de ses
paramètres
Method concat = String.class.getMethod(
"concat", String.class);
System.out.println(concat);
17. Invocation de j.l.r.Method
Permet d’appeler une méthode en indiquant
l’objet sur lequel on veut appeler la méthode
(null pour les méthodes statiques) suivi des
arguments
Object invoke(Object receiver, Object… args)
Par exemple,
var method = String.class.getMethod("concat", String.class);
Object result = method.invoke("hello", "o")
System.out.println(result);
18. getConstructors()
getConstructor(parameterClasses)
On peut obtenir les constructeurs publiques
– class.getConstructors()
ou un constructeur publique à partir du type des
paramètres
– class.getConstructor(parameterClasses)
Par exemple
Constructor<Point> constructor =
java.awt.Point.class.getConstructor(int.class, int.class);
System.out.println(constructor);
19. j.l.r.Constructor
j.l.r.Constructor possède les méthodes
– getModifier(),
– getParameterTypes()
– newInstance(...args) appel le constructeur
– Et plein d’autres
Par exemple
Constructor<Point> constructor =
java.awt.Point.class.getConstructor(int.class, int.class);
Object result = constructor.newInstance(2, 3);
20. getFields()/getField(name)
On peut aussi obtenir les champs publiques
– class.getFields()
ou un champ publique à partir de son nom
– class.getField(name)
Par exemple
Field field = java.awt.Point.class.getField("x");
System.out.println(field);
21. j.l.r.Field
j.l.r.Field possède les méthodes
– getModifier(), getName(),
– getType()
– Object get(Object instance)
●
et des versions spécialisées getInt(), getBoolean(), etc
– void set(Object instance, Object newValue)
●
Et des versions spécialisées setChar(), setFloat(), etc
et plein d’autres ...
23. ReflectionOperationException
Lorsque l’on utilise l’API de reflection, on sort du
système de typage donc le compilateur ne controle
pas
– Si la méthode existe
– Si la méthode est pas abstraite
– Si elle est bien appelé avec le bon objet
– Si on a le droit d’y accéder
– Etc
donc l’API lève des exceptions dans ces cas.
24. Exception et getMethod()
Class.getMethod(name, parameterClasses)
– NoSuchMethodException si la méthode n’existe
pas
Note: getMethod() marche même si la classe
contenant la méthode n’est pas publique
– ou le package contenant la classe est pas exporté
25. Exception et method.invoke()
Method.invoke(receiver, ...arguments)
– IllegalAccessException
●
La classe contenant la méthode ou la méthode n’est pas
accessible de l’endroit de l’appel
– IllegalArgumentException
●
Le receiver est pas de la bonne classe
– InvocationTargetException
●
Une exception s’est produite dans la méthode appelée
– le champs cause (getCause()) contient l’exception
26. InvocationTargetException
On doit propager l’exception “cause”
try {
...
} catch(InvocationTargetException e) {
var cause = e.getCause();
if (cause instanceof RuntimeException rte) {
throw rte; // on propage les runtime exceptions
}
if (cause instanceof Error error) {
throw error; // on propage les erreurs
}
// la méthode declare une exception
throw new UndeclaredThrowableException(cause);
}
27. getConstructor() et newInstance()
class.getConstructor(parameterTypes)
– NoSuchMethodException si le constructeur existe
pas
constructor.newInstance(...args)
– IllegalAccessException si le constructeur est pas
visible
– IllegalArgumentException si un argument est pas
de la bonne classe
– InvocationTargetException si une exception se
produit dans le constructeur
28. getField() et field.set()/get()
class.getField(name)
– NoSuchFieldException si le champ existe pas
field.get(receiver)
– IllegalAccessException si le champ est pas visible
– IllegalArgumentException si le receiver est pas de la
bonne classe
field.set(receiver, value)
– IllegalAccessException si le champ est pas visible ou final
– IllegalArgumentException si le receiver ou value est pas
de la bonne classe
30. record
j.l.Class possède une méthode isRecord()
class.getRecordComponents()
– Renvoie un tableau des composants du record
j.l.r.RecordComponent
– getName(), getType()
– Method getAccessor()
31. enum
j.l.Class possède une méthode isEnum()
class.getEnumConstants()
– Renvoie un tableau des valeurs de l’enum
32. Classes internes/locales
j.l.Class.getClasses() renvoie un tableau des
classes internes publiques
– Et j.l.Class.isMemberClass() est vrai
j.l.Class.getEnclosingMethod(),
getEnclosingConstructor() si la classe est
déclarée dans une méthode ou un constructeur
– Et j.l.Class.isLocalClass() est vrai
34. Tous les membres déclarés
Les méthodes
– getDeclaredMethods(),
getDeclaredMethod(name, parameterClasses)
– getDeclaredConstructors(),
getDeclaredConstructor(parameterClasses)
– getDeclaredFields(),
getDeclaredField(name)
permet d’obtenir tous les membres déclarés
(donc pas ceux récupéré par héritage) et pas
seulements les membres publiques
35. Sortir du modèle de sécurité
Lorsque l’on appel (invoke/newInstance/get/set)
la sécurité est vérifié par rapport à la méthode
qui fait l’appel
On peut appeler la méthode
setAccessible(true)
pour demander que les appels suivant passe
outre la sécurité
36. setAccessible()
La méthode setAccessible() lève
InaccessibleObjectException si il n’est pas
possible de passer outre la sécurité
– Si il existe un module et que le module est fermé
Un module correspond au fichier module-info.java
– Les classes du JDK sont dans des modules fermés
●
Pareil pour Spring, et autres frameworks JavaEE
– Si on déclare un module, il est fermé par défaut
38. Annotation
En Java, on peut déclarer soit même ses propres
annotations ou utiliser des annotations déjà écrites
Pour utiliser une annotation, on indique le nom de
la classe précédé d’une ‘@’ puis entre parenthèse
des couples clé/valeur
@Author(name = "John Doe",
company = "DoesSoftware")
public class Foo { … }
Les valeurs doivent être des constantes
39. Créer une annotation
Une annotation est une interface spéciale
contenant
– des méthodes sans paramètres
●
Les types de retour doit être un type de constante
●
Qui peuvent spécifier une valeur par défaut
– Annoté par des méta-annotations qui indique
●
Où on peut utliser l’annotation
●
Si l’annotation est visible à l’exécution
40. Créer une annotation
On utilise @interface pour déclarer une
annotation
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
String name();
String company();
int year() default 0; // indique une valeur
// par défaut
}
41. Meta-annotations
Permet d’indiquer comment l’annotation est utilisable
– Où peut-on utiliser l’annotation ?
@Target(ElementType…)
●
CONSTRUCTOR, FIELD, LOCAL_VARIABLE,
RECORD_COMPONENT, etc
– Garder dans le .class, accessible par reflection ?
@Retention(RetentionPolicy)
●
SOURCE, CLASS, RUNTIME
– Propager aux sous-classes ?
@Inherited
– Apparait dans la javadoc ?
@Documented
42. 3 sortes d’annotations
Marker annotation, annotation sans méthode
public @interface Version0 { }
Annotation avec une seule valeur, la méthode doit
s’appeler “value”
public @interface Version1 {
String value()
}
Annotation à plusieurs valeurs
public @interface Version2 {
int major();
int minor() default 0;
}
43. Utiliser les 3 sortes d’annotations
●
Marker annotation
@Version0
public class Foo { }
●
Annotation à une valeur
@Version1("14.0")
public record Foo() { }
●
Annotation avec plusieurs valeurs
@Version2(major = 14) // minor = 0
public enum Foo { }
44. Type des constantes
Une valeur d’une annotation peut être de type
– Type primitif: int, float, char, etc
– String
– Class
– Un enum (comme RetentionPolicy)
– Une annotation
– Un tableau des types précédents
(comme ElementType[])
en fait, tous les types qui peuvent contenir une constante
pour le compilateur
45. Pas d’héritage
Comme toutes les features récentes (2004 pour
les annotations) de Java, les annotations ne
permettent pas l’héritage
On utilise la composition à la place
– Une annotation peut contenir une annotation
Implicitement, les annotations hérite de
l’interface java.lang.annotation.Annotation
46. Tableau et Arbre d’annotation
Il n’est pas possible de créer des graphes (pas de
boucle), mais aucun problème pour créer des arbres
public @interface Version {
int value();
}
public @interface Product {
Version[] versions();
}
Et à l’utilisation
@Product(versions = { @Version(1), @Version(2) })
public class Foo { }
47. Répétition des annotations
Par défaut, une annotation n’est pas repetable,
mais on peut définir un container d’annotation, et
le meta-annoter avec @Repeatable(class)
– A la déclaration
public @interface Hello() { }
@Repeatable(Hello.class)
public @interface HelloContainer {
Hello[] container();
}
– A l’utilisation
@Hello @Hello
public record Foo() { }
49. Accessible par reflection
Pour être accessible, une annotation doit être
annoter avec la méta-annotation @Retention
avec la RentionPolicy.RUNTIME
Par exemple,
@Retention(RetentionPolicy.RUNTIME)
public @interface Hello { }
50. A l’exécution
Le type d’une annotation est une interface
(qui hérite de java.lang.annotation.Annotation)
Une annotation est instance d’une classe (créer
par le JDK) qui implante l’interface
correspondant à l’annotation
– Si on appel une des méthodes de l’interface, la
valeur correspondant à l’annotation est renvoyée
51. AnnotatedElement
Interface commune pour toutes les élements
annotable (Class, Method, Constructor, Field,
RecordComponent, etc)
– Tester la présence d’une annotation
boolean isAnnotationPresent(
Class<? extends Annotation> annotationType)
– Demander la valeur d’une annotation
(renvoie null si pas trouvée)
<A extends Annotation> A getAnnotation(
Class<A> annotationType)
52. Exemple
Avec
@Retention(RetentionPolicy.RUNTIME)
public @interface Say {
String message();
}
@Say(message="hello")
public class Foo { }
On récupère l’annotation
Say say = Foo.class.getAnnotation(Say.class);
System.out.println(say.message()); // appel de la méthode
// de l’interface
53. En conclusion
L’API de reflection permet de
– Passer outre le système de typage
●
Ne permet pas de passer outre la sécurité si un module
est définie
●
Demande de gérer correctement les exceptions
– La déclaration d’une annotation est une interface
– L’utilisation d’une annotation est une instance d’une
classe qui implante cette interface