2
* Copyright 2003 The Apache Software Foundation
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
16
package net.sf.cglib.beans;
18
import java.lang.reflect.Constructor;
19
import java.lang.reflect.Method;
20
import java.lang.reflect.Modifier;
22
import net.sf.cglib.core.*;
23
import org.objectweb.asm.ClassVisitor;
26
* @author Juozas Baliuka
28
abstract public class BulkBean
30
private static final BulkBeanKey KEY_FACTORY =
31
(BulkBeanKey)KeyFactory.create(BulkBeanKey.class);
33
interface BulkBeanKey {
34
public Object newInstance(String target, String[] getters, String[] setters, String[] types);
37
protected Class target;
38
protected String[] getters, setters;
39
protected Class[] types;
41
protected BulkBean() { }
43
abstract public void getPropertyValues(Object bean, Object[] values);
44
abstract public void setPropertyValues(Object bean, Object[] values);
46
public Object[] getPropertyValues(Object bean) {
47
Object[] values = new Object[getters.length];
48
getPropertyValues(bean, values);
52
public Class[] getPropertyTypes() {
53
return (Class[])types.clone();
56
public String[] getGetters() {
57
return (String[])getters.clone();
60
public String[] getSetters() {
61
return (String[])setters.clone();
64
public static BulkBean create(Class target, String[] getters, String[] setters, Class[] types) {
65
Generator gen = new Generator();
66
gen.setTarget(target);
67
gen.setGetters(getters);
68
gen.setSetters(setters);
73
public static class Generator extends AbstractClassGenerator {
74
private static final Source SOURCE = new Source(BulkBean.class.getName());
76
private String[] getters;
77
private String[] setters;
78
private Class[] types;
84
public void setTarget(Class target) {
88
public void setGetters(String[] getters) {
89
this.getters = getters;
92
public void setSetters(String[] setters) {
93
this.setters = setters;
96
public void setTypes(Class[] types) {
100
protected ClassLoader getDefaultClassLoader() {
101
return target.getClassLoader();
104
public BulkBean create() {
105
setNamePrefix(target.getName());
106
String targetClassName = target.getName();
107
String[] typeClassNames = ReflectUtils.getNames(types);
108
Object key = KEY_FACTORY.newInstance(targetClassName, getters, setters, typeClassNames);
109
return (BulkBean)super.create(key);
112
public void generateClass(ClassVisitor v) throws Exception {
113
new BulkBeanEmitter(v, getClassName(), target, getters, setters, types);
116
protected Object firstInstance(Class type) {
117
BulkBean instance = (BulkBean)ReflectUtils.newInstance(type);
118
instance.target = target;
120
int length = getters.length;
121
instance.getters = new String[length];
122
System.arraycopy(getters, 0, instance.getters, 0, length);
124
instance.setters = new String[length];
125
System.arraycopy(setters, 0, instance.setters, 0, length);
127
instance.types = new Class[types.length];
128
System.arraycopy(types, 0, instance.types, 0, types.length);
133
protected Object nextInstance(Object instance) {