那天在sun的论坛上漂着,不经意发现了一篇帖子,大概意思是想构造一个对象,但又不想或不能调用其构造方法.我把代码整理了一下,如下:
java 代码
-
- import java.io.Serializable;
-
- public class Test implements Serializable {
-
- private Test() {
- System.out.println("Test");
- }
- public void say()
- {
- System.out.println("Hello!");
- }
-
- }
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核心类库放在一起,但没有任何说明,不知道是让谁用的.
分享到:
相关推荐
但需要注意,这个方法要求类必须有一个无参构造器,如果没有,我们需要使用`getConstructor()`和`newInstance()`方法链来调用有参数的构造器。 3. **调用方法**:如果需要调用对象的方法,可以使用`getMethod()`...
在MyBatis中,反射扮演着关键角色,它使得框架能够动态地创建对象、调用方法以及修改对象的属性,极大地提高了代码的灵活性。在这个名为“mybatis-反射包注释.7z”的压缩包中,我们很可能是找到了MyBatis源代码中的...
在acquireMethodAccessor方法中,会通过 ReflectionFactory 类的newMethodAccessor创建一个实现了MethodAccessor接口的对象。 在 Java 反射机制中,还有一个重要的数据结构ReflectionData,用来缓存从 JVM 中读取类...
Hibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。 在描述的场景中,作者提到“金蛇剑”,这是用来比喻 Hibenate反序列化漏洞的一种形象说法,暗示着这个漏洞像一...
当计数器大于 ReflectionFactory.inflationThreshold(默认值是 15)时,用 MethodAccessorGenerator 创建一个新的 MethodAccessor,并将之前的 DelegatingMethodAccessorImpl 引用替换为现在新创建的。 一个方法...
Java反射 如何使用该应用程序: 提供软件包和要从中创建新对象的类的名称。 可以使用get方法检索的所有字段都将显示在表格中。 如果该字段具有设置方法,则可以对其进行编辑。 所有方法均在下拉框中列出。