• 通过反射调用内部类的隐藏方法


    可以通过反射来调用那些非公共访问权限的方法。对于final域实际上在修改时是安全的。运行时系统人在不招聘异常的情况下接受任何修改的尝试,但是实际上不会发生任何修改。在类中留下这种后门,也许可以使我们能够解决某一特定类型的问题。

     1 /**
     2  * 通过反射来调用内部类的私有方法
     3  */
     4 package typeinfo;
     5 
     6 import java.lang.reflect.Field;
     7 import java.lang.reflect.Method;
     8 
     9 interface A{
    10     void f();
    11 }
    12 class InnerA{
    13     private static class InnerB implements A{
    14         private int i=1;
    15         private final String s="I'm totally safe.";
    16         private void g() {
    17             System.out.println("private g() ");
    18         }
    19         @Override
    20         public void f() {
    21             System.out.println("public f()");
    22         }
    23         protected void h(){
    24             System.out.println("protected h()");
    25         }
    26         void v(){
    27             System.out.println("package v()");
    28         }
    29         public String toString(){
    30             return "i="+i+", s="+s;
    31         }
    32     }
    33     public static A makeA(){
    34         return new InnerB();
    35     }
    36 }
    37 /**
    38  * @author LYL
    39  *
    40  */
    41 public class InnerImplemetation {
    42     /**
    43      * 通过反射来调用对象的某一方法
    44      * @param a
    45      * @param methodName
    46      * @throws Exception
    47      */
    48     public static void callHiddenMethod(Object a,String methodName) throws Exception{
    49         Method method=a.getClass().getDeclaredMethod(methodName);
    50         //设置为可访问
    51         method.setAccessible(true);
    52         method.invoke(a);
    53     }
    54     
    55     public static Field modifyPrivateField(Object a,String fieldName) throws Exception{
    56         Field field=a.getClass().getDeclaredField(fieldName);
    57         field.setAccessible(true);
    58         return field;
    59     }
    60     public static void main(String args[]) throws Exception{
    61         A a=InnerA.makeA();
    62         //显示出typeinfo.InnerA$InnerB
    63         System.out.println(a.getClass());
    64         //
    65         a.f();
    66         //通过反射来调用对象的隐藏方法
    67         callHiddenMethod(a,"g");
    68         callHiddenMethod(a,"h");
    69         callHiddenMethod(a,"v");
    70         
    71         Field fieldI=modifyPrivateField(a,"i");
    72         fieldI.setInt(a,12);
    73         System.out.println("Private field I:"+fieldI.getInt(a));
    74         Field field=modifyPrivateField(a,"s");
    75         field.set(a, "new value");
    76         System.out.println("final s:"+field.get(a));
    77         //
    78         System.out.println(a);        
    79     }
    80 }

    输出:
    class typeinfo.InnerA$InnerB
    public f()
    private g()
    protected h()
    package v()
    Private field I:12
    final s:new value
    i=12, s=I'm totally safe.

  • 相关阅读:
    shell的格式化输出命令printf
    shell数组
    shell字符串
    shell注释
    shell运算符
    shell替换
    shell特殊变量
    shell变量
    linux修改主机名
    ssh免密码登录设置
  • 原文地址:https://www.cnblogs.com/bjwylpx/p/3677276.html
Copyright © 2020-2023  润新知