Java создать класс employee

Создание объектов с помощью рефлексии

Представь: перед тобой встала задача: нужно создать объект, используя рефлексию. Приступаем?

Начнем с начального класса, который мы хотим получить:

 public class Employee < private String name; private String surname; private int age; < age = -1; name = "Ivan"; surname = "Ivanov"; >public Employee(String name, String surname, int age) < this.name = name; this.surname = surname; this.age = age; >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; >@Override public String toString() < return "EmployeetoString() и блок инициализации. Теперь приступим ко второй части — созданию объекта с помощью рефлексии. Первый способ, который мы разберем, будет реализован через Class.newInstance().

 public class Main < public static void main(String[] args) throws InstantiationException, IllegalAccessException < Employee employee = Employee.class.newInstance(); System.out.println("age is - " + employee.getAge()); >> 

Отлично, запускаем наш код и ждем вывода возраста из инициализатора. Но получаем ошибку об отсутствии конструктора по умолчанию. Получается, с помощью этого метода мы можем получить только объект, созданный с помощью конструктора по умолчанию. Давайте добавим конструктор по умолчанию для нашего класса и протестируем код еще раз.

Результат программы после добавления конструктора:

Отлично, мы разобрались, как работает этот метод. Теперь давай заглянем к нему под капот. Открываем документацию и видим, что наш метод уже deprecated (англ. — устаревший):

А еще может выбросить исключения InstantiationException , IllegalAccessException . Поэтому в документации нам предлагают использовать второй способ создания объекта, а именно Constructor.newInstance() . Давай разберем работу класса Constructor и поговорим о нем подробнее.

Методы getConstructors и getDeclaredConstructors

Чтобы работать с классом Constructor , нам нужно сначала получить его. Для этого у нас есть два метода: getConstructors и getDeclaredConstructors .

Первый возвращает список публичных конструкторов в виде массива, а второй возвращает список всех конструкторов класса в виде массива.

Давай добавим немного приватности нашему классу, а именно сделаем несколько приватных конструкторов для отображения работы наших методов.

Добавляем немного приватных конструкторов:

 private Employee(String name, String surname)

В структуре нашего класса отлично видно, что один из конструкторов приватный:

Тестируем работу наших методов:

 public class Main < public static void main(String[] args) < Class employeeClass = Employee.class; System.out.println("getConstructors:"); printAllConstructors(employeeClass); System.out.println("\n" +"getDeclaredConstructors:"); printDeclaredConstructors(employeeClass); >static void printDeclaredConstructors(Class c) < for (Constructorconstructor : c.getDeclaredConstructors() ) < System.out.println(constructor); >> static void printAllConstructors(Class c) < for (Constructorconstructor : c.getConstructors()) < System.out.println(constructor); >> > 

И получаем такой результат:

getConstructors:
public ru.javarush.Employee(java.lang.String,java.lang.String,int)
public.ru.javarush.Employee()

getDeclaredConstructors:
private ru.javarush.Employee(java.lang.String,java.lang.String)
public ru.javarush.Employee(java.lang.String,java.lang.String,int)
public ru.javarush.Employee()

Отлично, таким образом мы получаем доступ к классу Constructor . Теперь можем поговорить о его возможностях.

Класс java.lang.reflect.Constructor, его основные методы

Давай взглянем на основные методы и как они работают:

Метод Описание
getName() Возвращает имя этого конструктора в виде строки.
getModifiers() Возвращает модификаторы языка Java в виде числа.
getExceptionTypes() Возвращает массив объектов класса, которые представляют типы исключений, объявленных конструктором.
getParameters() Возвращает массив объектов Parameter , которые представляют все параметры. Возвращает массив длины 0, если конструктор не имеет параметров.
getParameterTypes() Возвращает массив объектов класса, которые представляют формальные типы параметров в порядке объявления.
getGenericParameterTypes() Возвращает массив объектов типа, которые представляют формальные типы параметров в порядке объявления.

getName() & getModifiers()

Давай обернем наш массив в List , чтобы нам было удобно работать, и напишем метод getName и getModifiers :

 static List> getAllConstructors(Class constructor : constructors) < result.add(constructor.toString()); >return result; > static List getConstructorModifiers(List> constructors) < Listresult = new ArrayList<>(); for (Constructor c) < return new ArrayList<>(Arrays.asList(c.getExceptionTypes())); > var constructorExceptionTypes = getConstructorExceptionTypes(constructors.get(0)); System.out.println("Типы исключений :"); System.out.println(constructorExceptionTypes); 

Выше мы обратились к первому конструктору из нашего списка. Как получить определенный конструктор, мы обсудим чуть позже.

И посмотрим на вывод после добавления throws Exception :

И до добавления исключения:

Все прекрасно, но как посмотреть, какие параметры нужны для наших конструкторов? Давай разберем и эту часть.

getParameters() & getParameterTypes() & getGenericParameterTypes()

Начнем мы опять с доработки нашего приватного конструктора. Теперь он будет выглядеть вот так:

 private Employee(String name, String surname, List list)

И у нас появляются три дополнительных метода: getParameters для получения очередности параметров и их типов, getParameterTypes для получения типов параметров и getGenericParameterTypes для получения типов, обернутых в generics .

 static List getConstructorParameters(Constructor c) < return new ArrayList<>(Arrays.asList(c.getParameterTypes())); > static List getConstructorParametersGenerics(Constructor declaredConstructor = employeeClass.getDeclaredConstructor(String.class, String.class, List.class); System.out.println(declaredConstructor); Employee newInstance2 = (Employee) declaredConstructor.newInstance("NeIvan", "NeIvanov", new ArrayList<>()); System.out.printf(newInstance2.toString()); 

И в результате мы получим ошибку о приватности нашего конструктора:

Java не смогла создать объект через этот конструктор, но на самом деле есть маленькая волшебная штука, которую мы укажем в методе main . Она установит доступность к нашему конструктору и позволит создавать объекты нашего класса:

 declaredConstructor.setAccessible(true); 

Результат создания объекта:

Мы не устанавливаем возраст в нашем конструкторе, и он остается такой же, как и при инициализации.

Замечательно, пора подводить итоги!

Преимущества создания через Constructor.newInstance()

По названию оба метода выглядят одинаково, но между ними есть различия:

Class.newInstance() Constructor.newInstance()
Может вызывать только конструктор no-arg . Может вызывать любой конструктор независимо от количества параметров.
Требует, чтобы конструктор был виден. Также может вызывать приватные конструкторы при определенных обстоятельствах.
Выдает любое исключение (проверяемое или нет), которое задекларировано конструктором. Всегда обертывает выданное исключение с помощью InvocationTargetException .

По этим причинам Constructor.newInstance() предпочтительнее Class.newInstance() , и именно он используется различными фреймворками и API, такими как Spring, Guava, Zookeeper, Jackson, Servlet и т. д.

Источник

Java создать класс employee

JavaProblems.com - Free coding problems and exercises

Creating an Employee class in Java

Problem:

Create a class called Employee that includes three pieces of information as instance variables
1. First name (type String)
2. Last name (type String)
3. Monthly salary (double).
Your class should have the following methods:

-Constructor that initializes the three instance variables.
-Provide a set and a get method for each instance variable. If the monthly salary is not positive, set it to 0.0.
Write a test application named EmployeeTest that demonstrates class Employee's capabilities. Create two Employee objects and display each object's yearly salary. Then give each Employee a 10% raise and display each Employee's yearly salary again.

Output:

Solution:

public class Employee < private String firstName; private String lastName; private double monthlySalary; public Employee(String f, String l, double m)< firstName = f; lastName = l; if(m < 0)< // you can also use setMonthlySalary(m) monthlySalary =0; >else monthlySalary = m; > public String getFirstName() < return firstName; >public void setFirstName(String fname) < firstName = fname; >public String getLastName() < return lastName; >public void setLastName(String lname) < lastName = lname; >public double getMonthlySalary() < return monthlySalary; >public void setMonthlySalary(double m) < if(m < 0)< monthlySalary =0; >else monthlySalary = m; > public static void main(String[] args) < Scanner S = new Scanner(System.in); System.out.println("Enter the first name: "); String fname = S.next(); System.out.println("Enter the last name: "); String lname = S.next(); System.out.println("Enter the Salary: "); double sal = S.nextDouble(); Employee e =new Employee(fname,lname ,sal ); System.out.println("the yearly salary of "+e.getFirstName()+" " +e.getLastName()+" :"); System.out.println(e.getMonthlySalary()*12); double newsalary= e.getMonthlySalary()*0.1+e.getMonthlySalary(); e.setMonthlySalary(newsalary); System.out.println("the new yearly salary of "+ e.getFirstName()+" "+e.getLastName()+" :"); System.out.println(e.getMonthlySalary()*12); e.getMonthlySalary(); >>

Источник

Читайте также:  Get values from map javascript
Оцените статью