2007-03-19
用ReflectionFactory实现不调用构造参数创建对象
关键字: 反射
那天在sun的论坛上漂着,不经意发现了一篇帖子,大概意思是想构造一个对象,但又不想或不能调用其构造方法.我把代码整理了一下,如下:
由于Test类的构造方法是private的,因此在Main类中无法调用其构造方法创建对象.用ReflectionFactory可以给Test类动态创建一个构造方法,然后调用这个构造方法的newInstance方法创建对象.运行后我们可以发现,屏幕上打印出了"Hello",但并没有打印出 "Test".说明Test的原来的构造方法确实没被调用.
是不是挺有意思的?
然后用eclipse查看了一下ReflectionFactory类中的方法,发现有许多有意思的方法.如:
newField,newMethod,等等.但不知道参数具体是什么意思.但在google上,搜了半天,终于还是没有找到sun.reflect这个类库的api,或者相关说明.实在搞不明白,sun搞出来这么个类库,并且和java核心类库放在一起,但没有任何说明,不知道是让谁用的.
java 代码
- //Test.java
- import java.io.Serializable;
- public class Test implements Serializable {
- private Test() {
- System.out.println("Test");
- }
- public void say()
- {
- System.out.println("Hello!");
- }
- }
java 代码
- //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
constr = reflectionFactory - .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核心类库放在一起,但没有任何说明,不知道是让谁用的.
发表评论
- 浏览: 45769 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
四个有害的java习惯
不同观点: 1:一般的编辑器都把类数据和方法数据用颜色区分开,一目了然。加个a ...
-- by tom.liu -
四个有害的java习惯
to 42087743但问题在于javabean只是很少一部分java类,并且对 ...
-- by jolestar -
四个有害的java习惯
to jolestar : 你已经说了,javabean里只需要看一下几 ...
-- by 42087743 -
四个有害的java习惯
to coolnight 你说的这种情况只是javabean里的情况,而java ...
-- by jolestar -
四个有害的java习惯
很不同意第四点field声明只有一行, 把field声明放在最上面,更容易看清c ...
-- by coolnight






评论排行榜