I'm having issues using a private method inside a private class inside a public class using the reflections api. Here's a simplified code example:
public class Outer {
private class Inner {
private Integer value;
private Inner() {
this(0);
}
private Inner(Integer y) {
value = y;
}
private Integer someMethod(Integer x) {
return x * x;
}
}
}
Again, I want to be able to instantiate an Outer class object then call someMethod from the private Inner class. I've been trying to do this with reflections, but I can't seem to get past 1 level in. Also, the inner class may or may not have a constructor which most code seems to use. The above code is just the framework.
My current code:
Outer outerObject = new Outer();
Constructor<?> constructor = innerNodeClass.getDeclaredConstructor(Outer.class);
constructor.setAccessible(true);
Object innerObject = constructor.newInstance(outerObject);
innerObject.someMethod(5)
I looked up various ways to get to an inner class or private method, but can't find a way to get an outer object to an inner object without using the constructor. I'm only interested in using the private method in the inner class on an element in the outer object.
Outerand callsomeMehtod", "to get to an inner class", "to get an outer object to an inner object without using constructor", "using private method of inner class on an element in the outer". BTW "inner class may not have a constructor" is wrong, there always will be one for every object: the declared ones or a default oneInneris an inner class thus not a static nested class there is no way to get instance ofInnerthan creating first anOuterinstance. Hence you have to create two instances (outer,inner) to callinner.someMethod()and this implies to use the constructors ofOuterandInner.Classinstance for the inner class, like inClass<?> innerNodeClass = Arrays.stream( Outer.class.getDeclaredClasses() ).filter( c -> c.getSimpleName().equals("Inner") ).findFirst().get();- Alternative, if you can change the Outer class: add a static method returning this class (or something like that - depends on project/...) - LuCio's comment still applies!