用ReflectionFactory实现不调用构造参数创建对象

  那天在sun的论坛上漂着,不经意发现了一篇帖子,大概意思是想构造一个对象,但又不想或不能调用其构造方法.我把代码整理了一下,如下:

 

 

 //Test.java  
 import java.io.Serializable;  
    
public class Test implements Serializable {      
     private Test() {  
         System.out.println("Test");  
     }  
     public void say()  
     {  
       System.out.println("Hello!");  
     }  
       
 }  
 

 

 

  //Main.java
 import java.lang.reflect.Constructor;
 import java.security.AccessController;
 import sun.reflect.ReflectionFactory;

public class Main {
    private static final ReflectionFactory reflectionFactory = (ReflectionFactory) AccessController
             .doPrivileged(new ReflectionFactory.GetReflectionFactoryAction());

     public static void main(String[] args) throws Exception {
        Constructor<test> constr = reflectionFactory  </test>
                 .newConstructorForSerialization(Test.class, Object.class
                        .getConstructor(new Class[0]));
         Test test = (Test) constr.newInstance(new Object[0]);
        test.say();
    }
 }
 

 

   由于Test类的构造方法是private的,因此在Main类中无法调用其构造方法创建对象.用ReflectionFactory可以给Test类动态创建一个构造方法,然后调用这个构造方法的newInstance方法创建对象.运行后我们可以发现,屏幕上打印出了"Hello",但并没有打印出 "Test".说明Test的原来的构造方法确实没被调用.

    是不是挺有意思的?
    然后用eclipse查看了一下
ReflectionFactory类中的方法,发现有许多有意思的方法.如:
newField,newMethod,等等.
但不知道参数具体是什么意思.但在google上,搜了半天,终于还是没有找到sun.reflect这个类库的api,或者相关说明.实在搞不明白,sun搞出来这么个类库,并且和java核心类库放在一起,但没有任何说明,不知道是让谁用的.

标签 :

Related Posts
Null Object 模式之我见
JDK 6 Update 14内置VisualVM 1.1.1
Lucene范围查询(RangeQuery)的几个问题
ActiveMQ的一个问题
四个有害的java习惯
一个纯java的H.264播放器--Onavia Video Player


分类 : java