`

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

    博客分类:
  • JAVA
阅读更多

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

java 代码
 
  1. //Test.java  
  2. import java.io.Serializable;  
  3.    
  4. public class Test implements Serializable {  
  5.       
  6.     private Test() {  
  7.         System.out.println("Test");  
  8.     }  
  9.     public void say()  
  10.     {  
  11.         System.out.println("Hello!");  
  12.     }  
  13.       
  14. }  
java 代码
 
  1. //Main.java  
  2. import java.lang.reflect.Constructor;  
  3. import java.security.AccessController;  
  4. import sun.reflect.ReflectionFactory;  
  5.   
  6. public class Main {  
  7.   
  8.     private static final ReflectionFactory reflectionFactory = (ReflectionFactory) AccessController  
  9.             .doPrivileged(new ReflectionFactory.GetReflectionFactoryAction());  
  10.   
  11.     public static void main(String[] args) throws Exception {  
  12.         Constructor<test> constr = reflectionFactory  </test>
  13.                 .newConstructorForSerialization(Test.class, Object.class  
  14.                         .getConstructor(new Class[0]));  
  15.         Test test = (Test) constr.newInstance(new Object[0]);  
  16.         test.say();  
  17.     }  
  18. }  

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

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

分享到:
评论
1 楼 willse 2011-08-30  
嘿嘿,很好很强大! 有意思............

相关推荐

    利用java反射原理实现工厂模式

    但需要注意,这个方法要求类必须有一个无参构造器,如果没有,我们需要使用`getConstructor()`和`newInstance()`方法链来调用有参数的构造器。 3. **调用方法**:如果需要调用对象的方法,可以使用`getMethod()`...

    mybatis-反射包注释.7z

    在MyBatis中,反射扮演着关键角色,它使得框架能够动态地创建对象、调用方法以及修改对象的属性,极大地提高了代码的灵活性。在这个名为“mybatis-反射包注释.7z”的压缩包中,我们很可能是找到了MyBatis源代码中的...

    Java方法反射实现原理详解

    在acquireMethodAccessor方法中,会通过 ReflectionFactory 类的newMethodAccessor创建一个实现了MethodAccessor接口的对象。 在 Java 反射机制中,还有一个重要的数据结构ReflectionData,用来缓存从 JVM 中读取类...

    java反序列化漏洞-金蛇剑之hibernate(上).pdf

    Hibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。 在描述的场景中,作者提到“金蛇剑”,这是用来比喻 Hibenate反序列化漏洞的一种形象说法,暗示着这个漏洞像一...

    详解Java中Method的Invoke方法

    当计数器大于 ReflectionFactory.inflationThreshold(默认值是 15)时,用 MethodAccessorGenerator 创建一个新的 MethodAccessor,并将之前的 DelegatingMethodAccessorImpl 引用替换为现在新创建的。 一个方法...

    JavaReflection

    Java反射 如何使用该应用程序: 提供软件包和要从中创建新对象的类的名称。 可以使用get方法检索的所有字段都将显示在表格中。 如果该字段具有设置方法,则可以对其进行编辑。 所有方法均在下拉框中列出。

Global site tag (gtag.js) - Google Analytics