Podemos llamar al método privado de una clase desde otra clase en Java (que se definen usando el modificador de acceso privado en Java).
Podemos hacer esto cambiando el comportamiento de tiempo de ejecución de la clase usando algunos métodos predefinidos de Java. Para acceder a un método privado de clase diferente, usaremos la API de Reflection .
Para llamar al método privado, usaremos los siguientes métodos de Java.lang.class y Java.lang.reflect.Method
- Method[] getDeclaredMethods() : este método devuelve un objeto Method que refleja el método declarado especificado de la clase o interfaz representada por este objeto Class.
- setAccessible() : establece el indicador accesible para este objeto en el valor booleano indicado. Un valor de verdadero indica que el objeto reflejado debe suprimir la verificación de acceso al lenguaje Java cuando se usa. Un valor falso indica que el objeto reflejado debe aplicar comprobaciones de acceso al lenguaje Java.
- invocar() : Invoca el método subyacente representado por este objeto Método, en el objeto especificado con los parámetros especificados.
- Ejemplo 1: Cuando ya se conoce el nombre de la función privada.
// Java program to call
// private method of a
// class from another class
import
Java.lang.reflect.Method;
// The class containing
// a private method and
// a public method
class
Check {
// Private method
private
void
private_Method()
{
System.out.println(
"Private Method "
+
"called from outside"
);
}
// Public method
public
void
printData()
{
System.out.println(
"Public Method"
);
}
}
// Driver code
class
GFG {
public
static
void
main(String[] args)
throws
Exception
{
Check c =
new
Check();
// Using getDeclareMethod() method
Method m = Check.
class
.getDeclaredMethod(
"private_Method"
);
// Using setAccessible() method
m.setAccessible(
true
);
// Using invoke() method
m.invoke(c);
}
}
- Ejemplo 2: cuando no se conoce el nombre de la función privada pero se conoce el nombre de la clase.
// Java program to call private method
// of a class from another class
import
Java.lang.reflect.Method;
// The class contains a private method
class
Check {
// Private method
private
void
Demo_private_Method()
{
System.out.println(
"Private Method "
+
"called from outside"
);
}
// Public method
public
void
printData()
{
System.out.println(
"Public Method"
);
}
}
// Driver code
class
GFG {
public
static
void
main(String[] args)
throws
Exception
{
Check c =
new
Check();
Method m;
// Using getDeclareMethod() method
Method method[]
= Check.
class
.getDeclaredMethods();
for
(
int
i =
0
; i < method.length; i++) {
String meth
=
new
String(method[i].toString());
if
(meth.startsWith(
"private"
)) {
String s = method[i].toString();
int
a = s.indexOf(
"."
);
int
b = s.indexOf(
"("
);
// Method name retrieved
String method_name = s.substring(a +
1
, b);
// Print method name
System.out.println(
"Method Name = "
+ method_name);
// Using getDeclareMethod() method
m = Check.
class
.getDeclaredMethod(method_name);
// Using setAccessible() method
m.setAccessible(
true
);
// Using invoke() method
m.invoke(c);
}
}
}
}
Los siguientes programas demuestran la llamada del método privado en Java: