01: /**
02: * COPYRIGHT & LICENSE
03: *
04: * This code is Copyright (c) 2006 BEA Systems, inc. It is provided free, as-is and without any warranties for the purpose of
05: * inclusion in Objenesis or any other open source project with a FSF approved license, as long as this notice is not
06: * removed. There are no limitations on modifying or repackaging the code apart from this.
07: *
08: * BEA does not guarantee that the code works, and provides no support for it. Use at your own risk.
09: *
10: * Originally developed by Leonardo Mesquita. Copyright notice added by Henrik Sthl, BEA JRockit Product Manager.
11: *
12: */package org.drools.objenesis.instantiator.jrockit;
13:
14: import java.lang.reflect.Constructor;
15: import java.lang.reflect.Method;
16:
17: import org.drools.objenesis.ObjenesisException;
18: import org.drools.objenesis.instantiator.ObjectInstantiator;
19:
20: /**
21: * Instantiates a class by making a call to internal JRockit private methods. It is only supposed to
22: * work on JRockit 7.0 JVMs, which are compatible with Java API 1.3.1. This instantiator will not
23: * call any constructors.
24: *
25: * @author Leonardo Mesquita
26: * @see org.drools.objenesis.instantiator.ObjectInstantiator
27: */
28: public class JRockit131Instantiator implements ObjectInstantiator {
29:
30: private Constructor mungedConstructor;
31:
32: private static Method newConstructorForSerializationMethod;
33:
34: private static void initialize() {
35: if (newConstructorForSerializationMethod == null) {
36: Class cl;
37: try {
38: cl = Class.forName("COM.jrockit.reflect.MemberAccess");
39: newConstructorForSerializationMethod = cl
40: .getDeclaredMethod(
41: "newConstructorForSerialization",
42: new Class[] { Constructor.class,
43: Class.class });
44: newConstructorForSerializationMethod
45: .setAccessible(true);
46: } catch (final Exception e) {
47: throw new ObjenesisException(e);
48: }
49: }
50: }
51:
52: public JRockit131Instantiator(final Class type) {
53: initialize();
54:
55: if (newConstructorForSerializationMethod != null) {
56:
57: Constructor javaLangObjectConstructor;
58:
59: try {
60: javaLangObjectConstructor = Object.class
61: .getConstructor((Class[]) null);
62: } catch (final NoSuchMethodException e) {
63: throw new Error(
64: "Cannot find constructor for java.lang.Object!");
65: }
66:
67: try {
68: this .mungedConstructor = (Constructor) newConstructorForSerializationMethod
69: .invoke(null, new Object[] {
70: javaLangObjectConstructor, type });
71: } catch (final Exception e) {
72: throw new ObjenesisException(e);
73: }
74: }
75:
76: }
77:
78: public Object newInstance() {
79: try {
80: return this .mungedConstructor.newInstance((Object[]) null);
81: } catch (final Exception e) {
82: throw new ObjenesisException(e);
83: }
84: }
85: }
|