Solucionado (ver solución)
Solucionado
(ver solución)
9
respuestas

[Sugerencia] Qué usar en lugar del método newInstance() deprecado

Hola. A los 7 minutos del video (aproximadamente) el docente hace un comentario cuando Eclipse avisa que el método newInstance() está deprecado diciendo que para el curso no es muy importante. De todas maneras, creo que era bueno buscar la solución a este tema y creo que la encontré aquí en Stack Overflow: [https://stackoverflow.com/questions/46393863/what-to-use-instead-of-class-newinstance]. Está en inglés, pero el cambio que hay que realizar en el código es mínimo. En lugar de Accion accion = (Accion) clase.newInstance(); (la línea queda así al final del video) hay que escribir Accion accion = (Accion) clase.getDeclaredConstructor().newInstance(); y deja de haber warnings por este problema. Espero que sirva. Saludos

9 respuestas
solución!

¡Hola Paulo!

Gracias por compartir tu solución con la comunidad. En efecto, el método newInstance() está deprecado desde Java 9 y es importante estar al tanto de las alternativas para evitar problemas en el futuro.

Es genial que hayas encontrado una solución en Stack Overflow y que la hayas compartido con nosotros. Es importante estar actualizados en cuanto a las mejores prácticas de programación.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Estimados amigos, he buscado que el codigo funcione aun con lo que el compañero menciono, pero no he podido. Tienen alguna idea.

package com.alura.gerenciador.servlet;

import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException;

import com.alura.gerenciador.accion.Accion;

@WebServlet("/entrada") public class UnicaEntradaServlet extends HttpServlet { private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    String paramAccion = req.getParameter("accion");

    String nombreDeClase = "com.alura.gerenciador.accion."+paramAccion;
    String nombre;

    try {
        Class clase = Class.forName(nombreDeClase);
        ***Accion accion = (Accion) clase.getConstructor().newInstance();***
        nombre = accion.ejecutar(req, resp);
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException
            | IOException e) {
        throw new ServletException(e);
    }

    String[] tipoYDireccion = nombre.split(":");

    if(tipoYDireccion[0].equals("forward")) {
        RequestDispatcher rd = req.getRequestDispatcher("WEB-INF/view/" + tipoYDireccion[1]);
        rd.forward(req, resp);
    }else {
        resp.sendRedirect(tipoYDireccion[1]);
    }

}

}

He tenido que aplicar varios try para que funcione.

package com.alura.gerenciador.servlet;

import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException;

import com.alura.gerenciador.accion.Accion;

@WebServlet("/entrada") public class UnicaEntradaServlet extends HttpServlet { private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    String paramAccion = req.getParameter("accion");

    String nombreDeClase = "com.alura.gerenciador.accion."+paramAccion;
    String nombre;

    try {
        Class<?> clase = Class.forName(nombreDeClase);
        Accion accion = null;
        try {
            accion = (Accion) clase.getConstructor().newInstance();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        nombre = accion.ejecutar(req, resp);
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException
            | IOException e) {
        throw new ServletException(e);
    }

    String[] tipoYDireccion = nombre.split(":");

    if(tipoYDireccion[0].equals("forward")) {
        RequestDispatcher rd = req.getRequestDispatcher("WEB-INF/view/" + tipoYDireccion[1]);
        rd.forward(req, resp);
    }else {
        resp.sendRedirect(tipoYDireccion[1]);
    }

    /*
     * if(paramAccion.equals("LISEMP")) { System.out.println("Listar empresas");
     * 
     * ListaEmpresas listaEmpresas = new ListaEmpresas(); nombre =
     * listaEmpresas.ejecutar(req, resp);
     * 
     * }else if(paramAccion.equals("NUEEMP")) { System.out.println("Nueva empresa");
     * 
     * NuevaEmpresa nuevaEmpresa = new NuevaEmpresa(); nombre =
     * nuevaEmpresa.ejecutar(req, resp);
     * 
     * }else if(paramAccion.equals("MOSEMP")) {
     * System.out.println("Mostar empresa");
     * 
     * MostrarEmpresa mostrarEmpresa = new MostrarEmpresa(); nombre =
     * mostrarEmpresa.ejecutar(req, resp);
     * 
     * }else if(paramAccion.equals("MODEMP")) {
     * System.out.println("Modificar empresa");
     * 
     * ModificarEmpresa modificarEmpresa = new ModificarEmpresa(); nombre =
     * modificarEmpresa.ejecutar(req, resp);
     * 
     * }else if(paramAccion.equals("ELIEMP")) {
     * System.out.println("Eliminar empresa");
     * 
     * EliminarEmpresa eliminarEmpresa = new EliminarEmpresa(); nombre =
     * eliminarEmpresa.ejecutar(req, resp);
     * 
     * }else if(paramAccion.equals("NUEEMPFOR")) {
     * System.out.println("Form nueva empresa");
     * 
     * NuevaEmpresaForm nuevaEmpresaForm = new NuevaEmpresaForm(); nombre =
     * nuevaEmpresaForm.ejecutar(req, resp); }
     */




}

}

Hola Steve. Efectivamente, te faltan poner algunos tipos de Excepciones en el bloque try-catch. Yo tengo más, pero me las puso Eclipse automáticamente. Te copio el código completo, ver si te sirve:

try {
            Class<?> clase = Class.forName(nombreDeClase);
            Accion accion = (Accion) clase.getDeclaredConstructor().newInstance();
            nombre = accion.ejecutar(request, response);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException | NoSuchMethodException | SecurityException | ServletException
                | IOException e) {
            throw new ServletException(e);
        }

Saludos

Hice una ultima modificación y al parecer todo funciona ok.

package com.alura.gerenciador.servlet;

import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException;

import com.alura.gerenciador.accion.Accion;

@WebServlet("/entrada") public class UnicaEntradaServlet extends HttpServlet { private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String paramAccion = req.getParameter("accion");

    String nombreDeClase = "com.alura.gerenciador.accion."+paramAccion;
    String nombre;

    try {
        Class<?> clase = Class.forName(nombreDeClase);
        Accion accion = (Accion)clase.getConstructor().newInstance();
        nombre = accion.ejecutar(req, resp);
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException
            | IOException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
        throw new ServletException(e);
    }

    String[] tipoYDireccion = nombre.split(":");

    if(tipoYDireccion[0].equals("forward")) {
        RequestDispatcher rd = req.getRequestDispatcher("WEB-INF/view/"+tipoYDireccion[1]);
        rd.forward(req, resp);
    }else {
        resp.sendRedirect(tipoYDireccion[1]);
    }

}

}

Muchas gracias por la respuesta.

¡Hola Paulo!

Gracias por compartir tu solución con la comunidad.

Muchas gracias Steve y Paulo :) si no fuera por sus aportes no hubiese avanzado ya habia llegado un punto en que no me dajaba acceder a nada ... lo unico es que no sé por que no puedo acceder a la funcion eliminar :( pero al menos es un avance

Excelente Angelica... a terminar el curso que si se puede... un enorme abrazo desde Perú.