com.sta.mutils.PrivateAccess Maven / Gradle / Ivy
package com.sta.mutils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Name: PrivateAccess
* Description: Hilfsklasse für Zugriff auf private und protected - statische und dynamische - Felder und Methoden.
*
* Comment: ...
*
* Copyright: Copyright (c) 2018, 2019, 2021
* Company: >StA-Soft<
* @author StA
* @version 1.0
*/
public final class PrivateAccess
{
/**
* Wert eines privaten oder protected statischen Feld ermitteln.
* @param cls Klasse (es muss genau die Klasse sein, in dem das Feld deklariert ist)
* @param name Feldname
* @return Wert
* @throws Exception im Fehlerfall
*/
public static Object getStaticFieldValue(Class> cls, String name) throws Exception
{
Field field = cls.getDeclaredField(name);
boolean b = field.isAccessible();
if (!b)
{
field.setAccessible(true);
}
Object res = field.get(cls);
if (!b)
{
field.setAccessible(false);
}
return res;
}
/**
* Wert eines privaten oder protected statischen Feld setzen.
* @param cls Klasse (es muss genau die Klasse sein, in dem das Feld deklariert ist)
* @param name Feldname
* @param value Wert
* @throws Exception im Fehlerfall
*/
public static void setStaticFieldValue(Class> cls, String name, Object value) throws Exception
{
Field field = cls.getDeclaredField(name);
boolean b = field.isAccessible();
if (!b)
{
field.setAccessible(true);
}
field.set(cls, value);
if (!b)
{
field.setAccessible(false);
}
}
//---------------------------------------------------------------------------
/**
* Wert eines privaten oder protected Felds ermitteln.
* @param obj Instanz
* @param fieldname Feldname
* @return Wert
*/
public static Object getFieldValue(Object obj, String fieldname)
{
// Master sind die privaten Felder
Class c = obj.getClass();
try
{
while (c != null)
{
try
{
Field f = c.getDeclaredField(fieldname);
boolean b = f.isAccessible();
if (!b)
{
f.setAccessible(true);
}
Object res = f.get(obj);
if (!b)
{
f.setAccessible(false);
}
return res;
// break;
}
catch (Exception ex)
{
c = c.getSuperclass();
}
}
throw new Exception("Field " + fieldname + " not found.");
}
catch (Exception ex)
{
throw new RuntimeException("Field " + fieldname + " not found or can't get value.", ex);
}
}
/**
* Wert eines privaten oder protected Felds setzen.
* @param obj Instanz
* @param fieldname Feldname
* @param value Wert
*/
public static void setFieldValue(Object obj, String fieldname, Object value)
{
Class c = obj.getClass();
try
{
while (c != null)
{
try
{
Field f = c.getDeclaredField(fieldname);
boolean b = f.isAccessible();
if (!b)
{
f.setAccessible(true);
}
f.set(obj, value);
if (!b)
{
f.setAccessible(false);
}
return;
// break;
}
catch (Exception ex)
{
c = c.getSuperclass();
}
}
throw new Exception("Field " + fieldname + " not found.");
}
catch (Exception ex)
{
throw new RuntimeException("Field " + fieldname + " not found or can't set value.", ex);
}
}
//---------------------------------------------------------------------------
/**
* Aufruf einer Methode an einer Instanz einer Klasse, die private oder protected ist, optional mit Parameter-Übergabe und
* Ergebnis-Rückgabe.
* @param obj Instanz der Klasse
* @param methodname Methodenname
* @param paramtypes Paramter-Typen (optional, kann null sein)
* @param params Parameter (optional, kann null sein)
* @return Ergebnis des Aufrufs oder null, falls die Methode keinen Rückgabewert hat
*/
public static Object invokeMethod(Object obj, String methodname, Class[] paramtypes, Object[] params)
{
Class c = obj.getClass();
try
{
while (c != null)
{
try
{
Method m = c.getDeclaredMethod(methodname, paramtypes);
boolean b = m.isAccessible();
if (!b)
{
m.setAccessible(true);
}
Object res = m.invoke(obj, params);
if (!b)
{
m.setAccessible(false);
}
return res;
// break;
}
catch (Exception ex)
{
c = c.getSuperclass();
}
}
throw new Exception("Method " + methodname + " not found.");
}
catch (Exception ex)
{
throw new RuntimeException("Method " + methodname + " not found or can't call it.", ex);
}
}
/**
* Aufruf einer statischen Methode einer Klasse, die private oder protected ist, optional mit Parameter-Übergabe und
* Ergebnis-Rückgabe.
* @param c die Klasse
* @param methodname Methodenname
* @param paramtypes Paramter-Typen (optional, kann null sein)
* @param params Parameter (optional, kann null sein)
* @return Ergebnis des Aufrufs oder null, falls die Methode keinen Rückgabewert hat
*/
public static Object invokeStaticMethod(Class c, String methodname, Class[] paramtypes, Object[] params)
{
try
{
while (c != null)
{
try
{
Method m = c.getDeclaredMethod(methodname, paramtypes);
boolean b = m.isAccessible();
if (!b)
{
m.setAccessible(true);
}
Object res = m.invoke(null, params);
if (!b)
{
m.setAccessible(false);
}
return res;
// break;
}
catch (Exception ex)
{
c = c.getSuperclass();
}
}
throw new Exception("Method " + methodname + " not found.");
}
catch (Exception ex)
{
throw new RuntimeException("Method " + methodname + " not found or can't call it.", ex);
}
}
//===========================================================================
/**
* Dummy-Constructor.
*/
private PrivateAccess()
{
}
}