性能问答>java 反射调用 private 相关>
11回复

java 反射调用 private 相关



java 反射调用时,默认超过 15 次就会生成 java 类进行调用,那么问题是这个生成的类中为什么可以调用 private 的方法。

测试代码

public class ReflectTest {

    public static void main(String[] args) throws Exception {

        Method priStr = ReflectTest.class.getDeclaredMethod("priStr");
        priStr.setAccessible(true);
        for (int i = 0; i < 16; i++) {
            String s = priStr.invoke(null).toString();
            System.out.println(s + i);
        }

        TimeUnit.SECONDS.sleep(1000000000);
    }
    

    private static String priStr() {
        return "private string";
    }
}

动态生成的类

package sun.reflect;

import com.example.demo.reflect.ReflectTest;
import java.lang.reflect.InvocationTargetException;

public class GeneratedMethodAccessor2 extends MethodAccessorImpl {
    public Object invoke(Object var1, Object[] var2) throws InvocationTargetException {
        try {
            if (var2 != null && var2.length != 0) {
                throw new IllegalArgumentException();
            }
        } catch (NullPointerException | ClassCastException var4) {
            throw new IllegalArgumentException(var4.toString());
        }

        try {
            return ReflectTest.priStr();
        } catch (Throwable var3) {
            throw new InvocationTargetException(var3);
        }
    }

    public GeneratedMethodAccessor2() {
    }
}

上述 GeneratedMethodAccessor2 类中,为什么 ReflectTest.priStr() 这个 private 的方法可以被调用。

5327 阅读
请先登录,查看11条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步