com.sta.mutils.PrivateAccess Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xtools Show documentation
Show all versions of xtools Show documentation
Executable tools for all projects.
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()
{
}
}