docs(06-annotations): Добавлено задание в README
This commit is contained in:
43
labs/06-annotations/app/build.gradle.kts
Normal file
43
labs/06-annotations/app/build.gradle.kts
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file was generated by the Gradle 'init' task.
|
||||
*
|
||||
* This generated file contains a sample Java application project to get you started.
|
||||
* For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.10.2/userguide/building_java_projects.html in the Gradle documentation.
|
||||
*/
|
||||
|
||||
plugins {
|
||||
// Apply the application plugin to add support for building a CLI application in Java.
|
||||
application
|
||||
}
|
||||
|
||||
repositories {
|
||||
// Use Maven Central for resolving dependencies.
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// This dependency is used by the application.
|
||||
implementation(libs.guava)
|
||||
}
|
||||
|
||||
// Apply a specific Java toolchain to ease working on different environments.
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(23)
|
||||
}
|
||||
}
|
||||
|
||||
application {
|
||||
// Define the main class for the application.
|
||||
mainClass = "ru.mrqiz.annotations.App"
|
||||
}
|
||||
|
||||
tasks.named<Test>("test") {
|
||||
// Use JUnit Platform for unit tests.
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
tasks.named<JavaExec>("run") {
|
||||
standardInput = System.`in`
|
||||
}
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
package ru.mrqiz.annotations;
|
||||
|
||||
public class App {
|
||||
public static void main(String[] args) {
|
||||
Data dataToSave = new Data(10, 20, 30, 40, 50);
|
||||
SaveData saveData = new SaveData("/tmp/data.json", "/tmp/save.log");
|
||||
saveData.save(dataToSave);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
package ru.mrqiz.annotations;
|
||||
|
||||
public class Data {
|
||||
@Ok
|
||||
private Integer field1;
|
||||
|
||||
@Ok
|
||||
private Integer field2;
|
||||
|
||||
@Ugly(k = 10)
|
||||
private Integer field3;
|
||||
|
||||
@Ugly
|
||||
private Integer field4;
|
||||
|
||||
private Integer field5;
|
||||
|
||||
public Data(
|
||||
Integer field1,
|
||||
Integer field2,
|
||||
Integer field3,
|
||||
Integer field4,
|
||||
Integer field5
|
||||
) {
|
||||
this.field1 = field1;
|
||||
this.field2 = field2;
|
||||
this.field3 = field3;
|
||||
this.field4 = field4;
|
||||
this.field5 = field5;
|
||||
}
|
||||
|
||||
public Integer getField1() {
|
||||
return field1;
|
||||
}
|
||||
|
||||
public Integer getField2() {
|
||||
return field2;
|
||||
}
|
||||
|
||||
public Integer getField3() {
|
||||
return field3;
|
||||
}
|
||||
|
||||
public Integer getField4() {
|
||||
return field4;
|
||||
}
|
||||
|
||||
public Integer getField5() {
|
||||
return field5;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package ru.mrqiz.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface Ok {
|
||||
}
|
||||
|
||||
@ -0,0 +1,80 @@
|
||||
package ru.mrqiz.annotations;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Random;
|
||||
import java.util.logging.Logger;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.FileHandler;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
|
||||
public class SaveData {
|
||||
private static final Logger logger = Logger.getLogger(SaveData.class.getName());
|
||||
|
||||
private String logFileName;
|
||||
private String dataFileName;
|
||||
|
||||
public SaveData(String dataFileName, String logFileName) {
|
||||
this.logFileName = logFileName;
|
||||
this.dataFileName = dataFileName;
|
||||
setupLogger();
|
||||
}
|
||||
|
||||
private void setupLogger() {
|
||||
try {
|
||||
FileHandler fileHandler = new FileHandler(logFileName, true);
|
||||
fileHandler.setFormatter(new SimpleFormatter());
|
||||
logger.addHandler(fileHandler);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void save(Data data) {
|
||||
StringBuilder jsonBuilder = new StringBuilder();
|
||||
jsonBuilder.append("{\n");
|
||||
|
||||
boolean hasOkFields = false;
|
||||
|
||||
Field[] fields = data.getClass().getDeclaredFields();
|
||||
Random random = new Random();
|
||||
|
||||
for (Field field : fields) {
|
||||
field.setAccessible(true);
|
||||
try {
|
||||
if (field.isAnnotationPresent(Ok.class)) {
|
||||
hasOkFields = true;
|
||||
jsonBuilder.append(String.format(" \"%s\": \"%d\",\n", field.getName(), field.get(data)));
|
||||
} else if (field.isAnnotationPresent(Ugly.class)) {
|
||||
hasOkFields = true;
|
||||
Ugly uglyAnnotation = field.getAnnotation(Ugly.class);
|
||||
int k = uglyAnnotation.k();
|
||||
int randomValue = random.nextInt(2 * k + 1) - k;
|
||||
jsonBuilder.append(String.format(" \"%s\": \"%d\",\n", field.getName(), randomValue));
|
||||
} else {
|
||||
logger.warning("cant find annotations at '" + field.getName() + "', not writing in file.");
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
logger.severe("unable to get access to field: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (hasOkFields) {
|
||||
jsonBuilder.setLength(jsonBuilder.length() - 2);
|
||||
jsonBuilder.append("\n}");
|
||||
writeToFile(jsonBuilder.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private void writeToFile(String json) {
|
||||
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFileName))) {
|
||||
writer.write(json);
|
||||
} catch (IOException e) {
|
||||
logger.severe("unable to read to file: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,13 @@
|
||||
package ru.mrqiz.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface Ugly {
|
||||
int k() default 5;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user