All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sta.mutils.PrivateAccess Maven / Gradle / Ivy

There is a newer version: 1.11
Show newest version

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() { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy