• Июля 03, 2020, 02:34:05 pm
• Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Новости: Вебинар по выбору IT профессии: http://bit.ly/2S4kcC6

Автор Тема: Java Pro 18.06.20  (Прочитано 94 раз)

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1923
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Java Pro 18.06.20
« : Июня 24, 2020, 09:42:32 am »
Вперед  ;)
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

Seneka

  • Пользователи
  • *
  • Сообщений: 4
    • Просмотр профиля
Анкета
« Ответ #1 : Июня 25, 2020, 07:06:47 pm »
Создать проект «Анкета». Сделать возможность
ввода пользователем его имени, фамилии,
возраста и ответов на 2-3 вопроса. Данные
должны отправляться на сервер, который в ответ
должен вернуть статистику по ответам в виде
HTML документа.

1. QuestionServlet
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class QuestionServlet extends HttpServlet {

    private static int QUESTION_1_YES = 0;
    private static int QUESTION_2_YES = 0;
    private static int QUESTION_3_YES = 0;

    private static final String TEMPLATE = "<html>" +
            "<head><title>Profile</title></head>" +
            "<body><h1>%s</h1></body></html>";

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        final String q1 = req.getParameter("question1");
        final String q2 = req.getParameter("question2");
        final String q3 = req.getParameter("question3");

        int quest1 = "yes".equals(q1) ? ++QUESTION_1_YES : QUESTION_1_YES;
        int quest2 = "yes".equals(q2) ? ++QUESTION_2_YES : QUESTION_2_YES;
        int quest3 = "yes".equals(q3) ? ++QUESTION_3_YES : QUESTION_3_YES;

        String res = "<p>Listening to music: " + quest1 + "</p><br>"
                   + "<p>Reading books: "  + quest2 + "</p><br>"
                   + "<p>Watch movies: " + quest3 + "</p>";

        resp.getWriter().println(String.format(TEMPLATE, res));
    }
}

2. index.jsp
<head>
  <title>Profile</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/question" method="post">
    Name: <input type="text" name="userName"><br>
    Surname: <input type="text" name="userSurName"><br>
    Age: <input type="number" name="userAge"><br><br>
    Answer the questions:<br><br>
    Do like listening to music?<br>
    <input type="radio" name="question1" value="yes">Yes<br>
    <input type="radio" name="question1" value="no">No<br>
    Do you like reading books?<br>
    <input type="radio" name="question2" value="yes">Yes<br>
    <input type="radio" name="question2" value="no">No<br>
    Do you like to watch movies?<br>
    <input type="radio" name="question3" value="yes">Yes<br>
    <input type="radio" name="question3" value="no">No<br><br>
    <input type="submit">
</form>
</body>
</html>

Алексей Сторожик

  • Пользователи
  • *
  • Сообщений: 33
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #2 : Июня 26, 2020, 12:20:44 am »
Создать проект «Анкета». Сделать возможность
ввода пользователем его имени, фамилии,
возраста и ответов на 2-3 вопроса. Данные
должны отправляться на сервер, который в ответ
должен вернуть статистику по ответам в виде
HTML документа.

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>stat</servlet-name>
        <servlet-class>net.ukr.laya.StatServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>stat</servlet-name>
        <url-pattern>/stats</url-pattern>
    </servlet-mapping>
<welcome-file-list>
    <welcome-file>QWEST.html</welcome-file>
</welcome-file-list>
</web-app>

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>QUESTION</title>
</head>
<body>
<h1>QUESTION</h1>
<br/>
<form action="/stats" method="post">
    Name: <input type="text" name="userName"><br>
    Surname: <input type="text" name="userSurName"><br>
    Age: <input type="number" name="userAge"><br><br>
    <h1><b>What do you drink?</b></h1>
    <br/><input type="radio" name="drink" value="Tea"> Tea
    <br/><input type="radio" name="drink" value="Coffee"> Coffee
    <br/><input type="radio" name="drink" value="Beer"> Beer
    <br/><input type="radio" name="drink" value="Whiskey"> Whiskey
    <h1><b>What do you see?</b></h1>
    <br/><input type="radio" name="see" value="Sky"> Scy
    <br/><input type="radio" name="see" value="Table"> Table
    <br/><input type="radio" name="see" value="Monitor"> Monitor
    <br/><input type="radio" name="see" value="Grass"> Grass

    <br/><input type="submit">
</form>
</body>
</html>

Сервлет
package net.ukr.laya;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class StatServlet extends HttpServlet {
    private HashMap<String,Set<String>> tabl=new HashMap<>();
    private HashMap<String,Integer> calc=new HashMap<>();
    private static String HtmlForm="<html><head><title>QUESTION</title></head>" +
            "<body> %s <a href=\"/\" >BACK</a></body></html>";
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String t="<h1>Take the test</h1>";
        resp.getWriter().println(String.format(HtmlForm,t));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // resp.getWriter().println(String.format(HtmlForm,(req.getParameter("drink")+" is your choice")));
      Map<String,String[]> aa=req.getParameterMap();

      String answ="<table border=5 cellspacing=0>";
        Set<String> temp=aa.keySet();
        for (String b:temp ) {
            if(!b.contains("user")) {
                for (int i = 0; i < aa.get(b).length; i++) {
                    if (tabl.containsKey(b)) {
                        Set<String> rty = new HashSet<>();
                        rty = tabl.get(b);
                        rty.add(aa.get(b)[i]);
                        tabl.put(b, rty);
                    } else {
                        Set<String> rty = new HashSet<>();
                        rty.add(aa.get(b)[i]);
                        tabl.put(b, rty);
                    }
                    if (calc.containsKey(b + "/" + aa.get(b)[i])) {
                        calc.put(b + "/" + aa.get(b)[i], calc.get(b + "/" + aa.get(b)[i]) + 1);
                    } else {
                        calc.put(b + "/" + aa.get(b)[i], 1);
                    }
                }
            }
        }
      Set<String> a=tabl.keySet();
        for (String b:a ) {
            if(!b.contains("user")) {
                answ = answ + "<tr>";
                answ = answ + "<td align=\"center\">" + b + "</td>";
                for (String qwe : tabl.get(b)) {
                    int q = (calc.containsKey(b + "/" + qwe)) ? calc.get(b + "/" + qwe) : 0;
                    answ = answ + "<td align=\"center\">" + qwe + "-" + q + "</td>";
                }
                answ = answ + "</tr>";
            }
        }
        answ=answ+"</table>";
        resp.getWriter().println(String.format(HtmlForm,answ));
    }
}

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 13854
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #3 : Июня 26, 2020, 12:25:26 am »
Seneka
Решение верное

Алексей Сторожик
Решение верное

Никита Ващук

  • Пользователи
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Java Pro 18.06.20
« Ответ #4 : Июня 29, 2020, 01:54:50 pm »
Дз Анкета

package com.gmail.eee;

;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet<ru> extends javax.servlet.http.HttpServlet {
    private static int PET_DOG = 0;
    private static int PET_CAT = 0;
    private static int PET_OTHER = 0;
    private static int PET_NO = 0;
    private static int CITY_KIEV = 0;
    private static int CITY_DNEPR = 0;
    private static int CITY_LVIV = 0;
    private static int CITY_OTHER = 0;

    private static final String TEMPLATE = "<html lang=ru>" +
            "<head><title>Вопросы</title></head>" +
            "<body><h1>%s</h1></body></html>";

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        final String p1 = req.getParameter("pet");
        final String c2 = req.getParameter("city");

        final int dog = "Dog".equals(p1) ? ++PET_DOG : PET_DOG;
        final int cat = "Cat".equals(p1) ? ++PET_CAT : PET_CAT;
        final int other = "Other".equals(p1) ? ++PET_OTHER : PET_OTHER;
        final int no = "No".equals(p1) ? ++PET_NO : PET_NO;
        final int kiev = "Kiev".equals(c2) ? ++CITY_KIEV : CITY_KIEV;
        final int dnepr = "Dnepr".equals(c2) ? ++CITY_DNEPR : CITY_DNEPR;
        final int lviv = "Lviv".equals(c2) ? ++CITY_LVIV : CITY_LVIV;
        final int otherc = "Other".equals(c2) ? ++CITY_OTHER : CITY_OTHER;

        String res = "<p>У кого собака: " + dog + "</p><br>"
                + "<p>Have cat: " + cat + "</p><br>"
                + "<p>Have other: " + other + "</p><br>"
                + "<p>Nobody: " + no + "</p><br>"
                + "<p>From Kiev: " + kiev + "</p><br>"
                + "<p>From Dnepr: " + dnepr + "</p><br>"
                + "<p>From Lviv: " + lviv + "</p><br>"
                + "<p>From other city: " + otherc + "</p>";

        resp.getWriter().println(String.format(TEMPLATE, res));
    }
}

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Вопросы</title>
</head>
<body>
<h1>Вопросы</h1>
<form action="${pageContext.request.contextPath}/question" method="POST">
    Имя : <input type="text" name="userName" /><br>
    Фамилия: <input type="text" name="userSurName" /><br>
    Возраст: <input type="number" name="userAge" /><br><br>
    <h1><b>Есть ли у вас домашние животное ?</b></h1>
    <br/><input type="checkbox" name="pet" value="Dog" /> Собака
    <br/><input type="checkbox" name="pet" value="Cat" /> Кот
    <br/><input type="checkbox" name="pet" value="Other" /> Другое
    <br/><input type="checkbox" name="pet" value="No" /> Нет
    <h1><b>От куда вы?</b></h1>
    <br/><input type="radio" name="city" value="Kiev" /> Киев
    <br/><input type="radio" name="city" value="Dnepr" /> Днепр
    <br/><input type="radio" name="city" value="Lviv" /> Львов
    <br/><input type="radio" name="city" value="Other" /> Другой
    <br/>
    <br/><input type="submit" />
</form>
</body>
</html>

И у меня вопрос. Как сделать чтобы когда идет ответ от сервера с информацией и ты там написал на русском, видно было не знаками вопроса, а нормально. С английским хорошо работает, а с русским так и не разобрался String res = "<p>У кого собака: " + dog + "</p><br>"
                + "<p>Have cat: " + cat + "</p><br>"

romancter

  • Пользователи
  • *
  • Сообщений: 17
    • Просмотр профиля

Pavel_

  • Пользователи
  • *
  • Сообщений: 8
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #6 : Июня 30, 2020, 05:29:26 pm »
ДЗ №1 Анкета

Servlet.java
package com.gmail1408Svfp;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet extends HttpServlet{
    private static int  Q_1_YES = 0;
    private static int  Q_2_YES = 0;
    private static int  Q_3_YES = 0;

    private static final String TEMPLATE = "<html>"+"<head><title>*QUESTION*</title></head>"+"<body><h2>%s</h2></body></html>";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws IOException{
        final String qn1 = req.getParameter("question1");
        final String qn2 = req.getParameter("question2");
        final String qn3 = req.getParameter("question3");

        int q1 = "yes".equals(qn1) ? ++Q_1_YES : Q_1_YES;
        int q2 = "yes".equals(qn2) ? ++Q_2_YES : Q_2_YES;
        int q3 = "yes".equals(qn3) ? ++Q_3_YES : Q_3_YES;

        String res = "<p>Play football: " + q1 + "<p><br>" + "<p>Play basketball: " + q2 + "</p><br>" + "<p>Play tennis: " + q3 + "</p>";

        resp.getWriter().println(String.format(TEMPLATE,res));
    }

}

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>quest</servlet-name>
        <servlet-class>com.gmail1408Svfp.Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>quest</servlet-name>
        <url-pattern>/quest</url-pattern>
    </servlet-mapping>
</web-app>

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>*QUESTION*</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/quest" method="post">
      Name : <input type="text" name="userName"><br>
      Surname : <input type="text" name="userSurName"><br>
      Age:  <input type="number" name="userAge"><br><br>
      Do you like play football? <br>
        <input type="radio" name="question1" value="yes">Yes<br>
        <input type="radio" name="question1" value="no">No<br>
      Do you like play basketball? <br>
        <input type="radio" name="question2" value="yes">Yes<br>
        <input type="radio" name="question2" value="no">No<br>
      Do you like to tennis? <br>
        <input type="radio" name="question3" value="yes">Yes<br>
        <input type="radio" name="question3" value="no">No<br>
      <input type="submit">
    </form>
  </body>
</html>

Сделал  - Солоденко П.П.

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 13854
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #7 : Июля 01, 2020, 12:57:51 pm »
Никита Ващук
Так константы в Java не обьявляют
    private static int PET_DOG = 0;
Вы забыли модификатор final
А так решение верное

Romancter
В именах переменных в Java не принято использовать символ подчеркивания. Так, что такие имена не очень удачны:

private int q1_1 = 0;
private int q1_2 = 0;
Решение верное

Pavel_
Решение верное

Алексей Сторожик

  • Пользователи
  • *
  • Сообщений: 33
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #8 : Июля 01, 2020, 10:05:36 pm »
ДЗ 2.1 Создать аннотацию , которая принимает параметры для метода . Написать код, который
вызовет метод, помеченный этой аннотацией, и передаст параметры аннотации в
вызываемый метод.
import java.lang.annotation.*;

@Inherited
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
    String name();
    int age();
}

public class RTest {
    public static void hello(){
        System.out.println("Hello");
    }
    @MyTest(name = "Alex",age = 36)
    public static void prin(String n, int a){
        System.out.println(n+" is "+a+" years old");
    }

}

import java.lang.reflect.Method;

public class Main {
    public static void main (String ...args){
       RTest.prin("Kiril",9);
       RTest.hello();
        Method[] metods=RTest.class.getDeclaredMethods();
        for (Method method :metods) {
            if(method.isAnnotationPresent(MyTest.class)){
                try {
                    System.out.println(method.getAnnotations()[0]);
                    MyTest mt=method.getAnnotation(MyTest.class);
                    method.invoke(null, mt.name(),mt.age());
                }catch ( Exception e){
                    System.out.println("Something is wrong");
                    System.out.println(e);
                }

            }
           
        }
    }
}

ДЗ 2.2
Написать класс TextContainer , который содержит в себе строку. С помощью механизма
аннотаций указать 1) в какой файл должен сохраниться текст 2) метод, который выполнит
сохранение. Написать класс Saver , который сохранит поле класса TextContainer в указанный
файл.
import java.io.FileWriter;
import java.io.IOException;
import java.lang.annotation.*;
import java.lang.reflect.Method;


@Retention(RetentionPolicy.RUNTIME)
@interface MyWay {
    String myWay() default "a.txt";
}

@Retention(RetentionPolicy.RUNTIME)
@interface Write {}


public class Main {
    public static void main(String ...args){
    TextContainer aa=new TextContainer("PAMPADUR");
    Class cl=aa.getClass();
    try {
        if (cl.isAnnotationPresent(MyWay.class)) {
            Method[] md = cl.getMethods();
            for (Method m1 : md) {
                if (m1.isAnnotationPresent(Write.class)) {
                    MyWay mv = (MyWay) cl.getAnnotation(MyWay.class);
                    m1.invoke(aa, mv.myWay());
                    System.out.println("Done");
                }

            }
        }
    }catch (Exception e){
        System.out.println(e);
    }
    }
}
@MyWay(myWay = "D:\\pamparam.txt")
class TextContainer{
    private String text;

    public TextContainer(String text) {
        this.text = text;
    }

    @Write
    public void save(String file){
        try(FileWriter f=new FileWriter(file)){
           f.write(text);
        } catch (IOException e) {
           e.printStackTrace();
        }
    }

}




Seneka

  • Пользователи
  • *
  • Сообщений: 4
    • Просмотр профиля
Reflection
« Ответ #9 : Июля 02, 2020, 12:09:28 pm »
1. Создать аннотацию, которая принимает параметры для метода. Написать код, который
вызовет метод, помеченный этой аннотацией, и передаст параметры аннотации в
вызываемый метод.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    int a();
    int b();
}

public class Test {
    @TestAnnotation(a = 2, b = 5)
    public static void test(int a, int b) {
        System.out.println(a + b);
    }
}

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {

        Class<?> cls = Test.class;
        Method method = cls.getMethod("test", int.class, int.class);
        TestAnnotation annotation = method.getAnnotation(TestAnnotation.class);
        method.invoke(cls, annotation.a(), annotation.b());

    }
}

2. Написать класс TextContainer, который содержит в себе строку. С помощью механизма
аннотаций указать 1) в какой файл должен сохраниться текст 2) метод, который выполнит
сохранение. Написать класс Saver, который сохранит поле класса TextContainer в указанный
файл.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Saver {
}

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface SaveTo {
    String path();
}

import java.io.FileWriter;
import java.io.IOException;

@SaveTo(path = "E:\\text.txt")
public class TextContainer {
    private final static String TEXT = "Save this text";

    @Saver
    public void save(String path) throws IOException {
        try (FileWriter writer = new FileWriter(path)) {
            writer.write(TEXT);
        }
    }
}

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        TextContainer container = new TextContainer();
        Class<?> cls = container.getClass();

        if(!cls.isAnnotationPresent(SaveTo.class)) {
            System.out.println("Process not successful");
        }

        SaveTo saveTo = cls.getAnnotation(SaveTo.class);
        String path = saveTo.path();
        Method method = cls.getMethod("save", String.class);
        method.invoke(container, path);

        System.out.println("Process successful");
    }
}
« Последнее редактирование: Июля 02, 2020, 12:50:10 pm от Seneka »

Seneka

  • Пользователи
  • *
  • Сообщений: 4
    • Просмотр профиля
Reflection
« Ответ #10 : Июля 02, 2020, 05:50:15 pm »
3. Написать код, который сериализирует и десериализирует в/из файла все значения полей
класса, которые отмечены аннотацией @Save.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Save {
}

public class User {
    @Save
    private String name;
    private String surName;
    @Save
    private int age;
    @Save
    private boolean haveExperience;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurName() {
        return surName;
    }

    public void setSurName(String surName) {
        this.surName = surName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isHaveExperience() {
        return haveExperience;
    }

    public void setHaveExperience(boolean haveExperience) {
        this.haveExperience = haveExperience;
    }
}

******Не удалось сделать метод десериализации, так как при обращении к полям класса в строке
           f = tCls.getField("name");
           вылетает ексепшн:
*****************************
           Exception in thread "main" java.lang.NoSuchFieldException: name
   at java.lang.Class.getField(Class.java:1703)
   at com.company.Serializer.deserialize(Serializer.java:58)
   at com.company.Main.main(Main.java:16)
****************************
Поэтому, прошу помощи разобраться в чем причина.

import java.io.*;
import java.lang.reflect.Field;

public class Serializer {
    public static void serialize(Object o, String path) throws IOException {
        Class<?> cls = o.getClass();
        Field[] fields = cls.getDeclaredFields();

        for(Field field : fields) {
            if(!field.isAnnotationPresent(Save.class)) {
                continue;
            }

            field.setAccessible(true);

            try (ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(path))) {
                writer.writeObject(String.valueOf(field));
            }

        }

    }

    public static <T> T deserialize(String path, Class<T> cls) throws IOException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        T res = cls.newInstance();
        Object o = null;
        Object value = null;
        Field f = null;

        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))){
            o = ois.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        assert o != null;
        Class<?> tCls = o.getClass();

        Field[] fields = cls.getDeclaredFields();
        Field[] fieldsT = tCls.getDeclaredFields();


        for(Field field : fields) {

            if (!field.isAnnotationPresent(Save.class)) {
                continue;
            }

            field.setAccessible(true);

            if (field.getType() == String.class) {
                for (Field fieldT : fieldsT) {
                    fieldT.setAccessible(true);
//                    if(fieldT.getName().equals("name")) {
                        f = tCls.getField("name");
                        value = (String) f.get(o);

                    }
//                }

                 field.set(res, value);

            }

            if (field.getType() == int.class) {
                for (Field fieldT : fieldsT) {
                    fieldT.setAccessible(true);
//                    if (fieldT.getName().equals("age")) {
                        f = tCls.getField("age");
                        value = f.getInt(o);

//                    }
                }

                field.setInt(res, (Integer) value);
            }

            if (field.getType() == boolean.class) {
                for (Field fieldT : fieldsT) {
                    fieldT.setAccessible(true);
//                    if(fieldT.getName().equals("haveExperience")) {
                        f = tCls.getField("haveExperience");
                        value = f.getInt(o);
                    }

//                }
                field.setBoolean(res, (Boolean) value);
            }
        }

        return res;
    }
}

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, NoSuchFieldException {
    User user = new User();
    user.setName("Ivan");
    user.setSurName("Ivanenko");
    user.setAge(30);
    user.setHaveExperience(true);

    Serializer.serialize(user, "E:\\text.txt");

    User userDes = Serializer.deserialize("E:\\text.txt", User.class);

System.out.println(userDes);
System.out.println(userDes.getName());
System.out.println(userDes.getSurName());
System.out.println(userDes.getAge());
System.out.println(userDes.isHaveExperience());
    }
}

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 13854
    • Просмотр профиля
    • E-mail
Re: Java Pro 18.06.20
« Ответ #11 : Июля 02, 2020, 11:36:54 pm »
Алексей Сторожик
Решение верное

Seneka
В этой строке вы постоянно перезаписываете этот файл
       try (ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(path))) {
                writer.writeObject(String.valueOf(field));
            }

Так, что в нем будет только последнее поле
Да и записываете только строковое представление поля. Т.е. в итоге сохраняется строка, со значением последнего поля.
Т.е. тут вы вычитываете
            o = ois.readObject();
Просто строку. И все. Ну и вы пытаетесь, что то из этой строки вытянуть. Чего в ней явно нет.

Seneka

  • Пользователи
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Java Pro 18.06.20
« Ответ #12 : Сегодня в 10:59:31 am »
Понял. Спасибо