aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/core/util/reflect
diff options
context:
space:
mode:
authorJordan Byrne <draknyte1@hotmail.com>2018-02-22 13:55:56 +1000
committerJordan Byrne <draknyte1@hotmail.com>2018-02-22 13:55:56 +1000
commit24905c16017decae4ee60ce4128b6d26de66baf5 (patch)
tree503cef5b6b77e04b11feea7563cd5f4ef5ef6942 /src/Java/gtPlusPlus/core/util/reflect
parentc5ddbd07991eea29132efbd7f4131ab9a4a977cf (diff)
downloadGT5-Unofficial-24905c16017decae4ee60ce4128b6d26de66baf5.tar.gz
GT5-Unofficial-24905c16017decae4ee60ce4128b6d26de66baf5.tar.bz2
GT5-Unofficial-24905c16017decae4ee60ce4128b6d26de66baf5.zip
% Minor project cleanup.
Diffstat (limited to 'src/Java/gtPlusPlus/core/util/reflect')
-rw-r--r--src/Java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java4
-rw-r--r--src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java74
2 files changed, 73 insertions, 5 deletions
diff --git a/src/Java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java b/src/Java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
index 3542ea6143..aee1c4dfec 100644
--- a/src/Java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
+++ b/src/Java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
@@ -8,8 +8,8 @@ import gregtech.api.enums.GT_Values;
import gregtech.api.interfaces.internal.IGT_RecipeAdder;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.util.Utils;
-import gtPlusPlus.core.util.fluid.FluidUtils;
-import gtPlusPlus.core.util.item.ItemUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
diff --git a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
index a0968fd5c1..ac7b8492e2 100644
--- a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
+++ b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
@@ -14,7 +14,7 @@ import net.minecraft.client.Minecraft;
public class ReflectionUtils {
- public static Field getField(final Class clazz, final String fieldName) throws NoSuchFieldException {
+ public static Field getField(final Class<?> clazz, final String fieldName) throws NoSuchFieldException {
try {
Field k = clazz.getDeclaredField(fieldName);
makeAccessible(k);
@@ -172,10 +172,10 @@ public class ReflectionUtils {
public static boolean invoke(Object objectInstance, String methodName, Class[] parameters, Object[] values){
if (objectInstance == null || methodName == null || parameters == null || values == null){
- Logger.REFLECTION("Null value when trying to Dynamically invoke "+methodName+" on an object of type: "+objectInstance.getClass().getName());
+ //Logger.REFLECTION("Null value when trying to Dynamically invoke "+methodName+" on an object of type: "+objectInstance.getClass().getName());
return false;
}
- Class mLocalClass = (objectInstance instanceof Class ? (Class) objectInstance : objectInstance.getClass());
+ Class<?> mLocalClass = (objectInstance instanceof Class ? (Class<?>) objectInstance : objectInstance.getClass());
Logger.REFLECTION("Trying to invoke "+methodName+" on an instance of "+mLocalClass.getCanonicalName()+".");
try {
Method mInvokingMethod = mLocalClass.getDeclaredMethod(methodName, parameters);
@@ -201,6 +201,74 @@ public class ReflectionUtils {
return false;
}
+ /*
+ * @ if (isPresent("com.optionaldependency.DependencyClass")) { // This
+ * block will never execute when the dependency is not present // There is
+ * therefore no more risk of code throwing NoClassDefFoundException.
+ * executeCodeLinkingToDependency(); }
+ */
+ public static boolean isPresent(final String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (final Throwable ex) {
+ // Class or one of its dependencies is not present...
+ return false;
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static Method getMethodViaReflection(final Class<?> lookupClass, final String methodName,
+ final boolean invoke) throws Exception {
+ final Class<? extends Class> lookup = lookupClass.getClass();
+ final Method m = lookup.getDeclaredMethod(methodName);
+ m.setAccessible(true);// Abracadabra
+ if (invoke) {
+ m.invoke(lookup);// now its OK
+ }
+ return m;
+ }
+
+ public static Class<?> getNonPublicClass(final String className) {
+ Class<?> c = null;
+ try {
+ c = Class.forName(className);
+ } catch (final ClassNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // full package name --------^^^^^^^^^^
+ // or simpler without Class.forName:
+ // Class<package1.A> c = package1.A.class;
+
+ if (null != c) {
+ // In our case we need to use
+ Constructor<?> constructor = null;
+ try {
+ constructor = c.getDeclaredConstructor();
+ } catch (NoSuchMethodException | SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // note: getConstructor() can return only public constructors
+ // so we needed to search for any Declared constructor
+
+ // now we need to make this constructor accessible
+ if (null != constructor) {
+ constructor.setAccessible(true);// ABRACADABRA!
+
+ try {
+ final Object o = constructor.newInstance();
+ return (Class<?>) o;
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
}