清晨

新的开始

导航

Java安全系列 - 突破私有构造限制

Posted on 2015-03-13 16:19  gdds  阅读(189)  评论(0)    收藏  举报

我们知道当一个类的构造方法被设为私有时,这就意味着我们不能通过new关键字来直接创建这个对象,这时我们可以通过sun.misc.Unsafe来实现我们创建对象的目的,这个类是Java基于底层操作的API,可以直接进行底层操作,例如获得某个属性的偏移地址,甚至可以直接将class文件字节码载入到内存,直接突破Java虚拟机沙箱限制。

1.创建User.java,内容如下:

public class User{   

    private User(){

        System.out.println("constructor User..");

    }   

}

 

2.创建UnsafeTest

import java.lang.reflect.Field;

import sun.misc.Unsafe;

 

public class UnsafeTest {

 

    public static void main(String[] args) {

        try{

            //使用UnSafe构造实例

            Field field = Unsafe.class.getDeclaredField("theUnsafe");

            field.setAccessible(true);

            Unsafe unsafe = (Unsafe) field.get(null);

            User user=(User)unsafe.allocateInstance(User.class);

            System.out.println(user);

           

        }catch(Exception e){

            e.printStackTrace();  

        }

    }  

}

 

 

输出:

User@61de33