我知道我们可以通过反射访问私有构造函数,就像@Sanjay T.Sharma在回答我的问题时提到的:“instanceof void”总是返回false吗?
不过,@Duffymo表示:
您可以使用反射访问私有的所有东西--方法、构造函数、数据成员、所有东西。
1)如何访问私有方法和私有数据成员?
您可以在setAccessible(true)
方法的少许帮助下完成此操作:
class Dummy{
private void foo(){
System.out.println("hello foo()");
}
private int i = 10;
}
class Test{
public static void main(String[] args) throws Exception {
Dummy d = new Dummy();
/*--- [INVOKING PRIVATE METHOD] ---*/
Method m = Dummy.class.getDeclaredMethod("foo");
//m.invoke(d); // Exception java.lang.IllegalAccessException
m.setAccessible(true);//Abracadabra
m.invoke(d); // Now it's OK
/*--- [GETING VALUE FROM PRIVATE FIELD] ---*/
Field f = Dummy.class.getDeclaredField("i");
//System.out.println(f.get(d)); // Not accessible now
f.setAccessible(true); // Abracadabra
System.out.println(f.get(d)); // Now it's OK
/*--- [SETTING VALUE OF PRIVATE FIELD] ---*/
Field f2 = Dummy.class.getDeclaredField("i");
//f2.set(d,20); // Not accessible now
f2.setAccessible(true); // Abracadabra
f2.set(d, 20); // Now it's OK
System.out.println(f2.get(d));
}
}
2)是否可以通过反射访问局部变量?
不能。不能在创建局部变量的块之外访问局部变量(有人可能会说,您可以将这样的变量赋给field=localvariable;
这样的字段,然后通过反射访问这样的字段,但这样我们访问的是值,而不是变量)。
3)有什么方法可以阻止任何人访问私有构造函数、方法和数据成员吗?
我认为对于构造函数
或方法
,您可以使用stacktrace检查它是否被反射
调用。
对于字段,我找不到阻止通过反射访问它们的解决方案。
class Dummy {
private void safeMethod() {
StackTraceElement[] st = new Exception().getStackTrace();
// If a method was invoked by reflection, the stack trace would be similar
// to something like this:
/*
java.lang.Exception
at package1.b.Dummy.safeMethod(SomeClass.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
-> at java.lang.reflect.Method.invoke(Method.java:601)
at package1.b.Test.main(SomeClass.java:65)
*/
//5th line marked by "->" is interesting one so I will try to use that info
if (st.length > 5 &&
st[4].getClassName().equals("java.lang.reflect.Method"))
throw new RuntimeException("safeMethod() is accessible only by Dummy object");
// Now normal code of method
System.out.println("code of safe method");
}
// I will check if it is possible to normally use that method inside this class
public void trySafeMethod(){
safeMethod();
}
Dummy() {
safeMethod();
}
}
class Dummy1 extends Dummy {}
class Test {
public static void main(String[] args) throws Exception {
Dummy1 d1 = new Dummy1(); // safeMethod can be invoked inside a superclass constructor
d1.trySafeMethod(); // safeMethod can be invoked inside other Dummy class methods
System.out.println("-------------------");
// Let's check if it is possible to invoke it via reflection
Method m2 = Dummy.class.getDeclaredMethod("safeMethod");
// m.invoke(d);//exception java.lang.IllegalAccessException
m2.setAccessible(true);
m2.invoke(d1);
}
}
test
主方法的输出:
code of safe method
code of safe method
-------------------
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at package1.b.Test.main(MyClass2.java:87)
Caused by: java.lang.RuntimeException: method safeMethod() is accessible only by Dummy object
at package1.b.Dummy.safeMethod(MyClass2.java:54)
... 5 more
问题内容: 我正在尝试编写一种使用反射将在类中获取私有字段的方法。 这是我的课程(此示例已简化): 所以说我这样做: 我得到一个因为是私人的。有没有一种方法可以使用反射来获取/设置私有变量?(我已经在C#中完成了,但这是我第一次在Java中尝试过它)。如果您想知道为什么需要这样做:),这是因为有时在单元测试期间,将私有变量设置为虚假值以进行故障测试等很方便。 问题答案: 弄清楚了。需要
我在使用reflections api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: 同样,我希望能够实例化一个类对象,然后从私有类调用。我一直试图通过反射来做到这一点,但我似乎无法超过1级。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是框架。 我当前的代码: 我查找了各种方法来获取内部类或私有方法,但找不到在不使用构造函数的情况下将外部对象获取到
问题内容: 我找到了一种通过来获取继承成员并通过来获得 ; 私有成员的方法,但是我正在寻找私有的继承字段。我怎样才能做到这一点? 问题答案: 这应该演示如何解决它: (或Class.getDeclaredFields用于所有字段的数组。) 输出:
问题内容: 考虑这个例子: 允许您通过反射来访问类的私有字段似乎是不合逻辑的。为什么有这样的功能?允许这样的访问不是“危险”吗? 问题答案: 专用旨在防止意外滥用,而不是作为一种安全机制。如果您选择绕过它,那么您可以自行承担风险,并假设您知道自己在做什么。
问题内容: Java中是否可以通过反射访问私有字段str?例如获取该字段的值。 问题答案: 是。 然后,使用字段对象获取类实例上的值。 请注意,方法通常会使人们感到困惑。你有该字段,但没有该对象的实例。你必须将其传递给方法
我有一个方法如下: 为了通过反射调用此函数,我尝试了以下代码段,但结果不成功: 那么,有没有一种方法可以通过Java反射调用像findEntity这样的方法? 谢谢