import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import com.opensymphony.xwork2.ObjectFactory;
/**
* Description: 通过反射将viewModel里的值为显示层viewModelForm赋值 <br>
*
* @author zhangqi
* @time Dec 6, 2010 3:42:09 PM
* @version
*/
public class ReflectViewModel {
/**
* 在这个类里面存在有copy()方法,根据指定的方法的参数去 构造一个新的对象的拷贝 并将他返回
*
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
*/
public Object copy1(Object obj, List<FgJyptViewmodel> viewmodelList)
throws IllegalArgumentException, SecurityException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
// 获得对象的类型
Class classType = obj.getClass();
// System.out.println("该对象的类型是:" + classType.toString());
// 通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {});
// 获得对象的所有属性
Field[] fields = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
// 获取数组中对应的属性
Field field1 = fields[i];
String fieldName = field1.getName();
String stringLetter = fieldName.substring(0, 1).toUpperCase();
// 获得相应属性的getXXX和setXXX方法名称
String getName = "get" + stringLetter + fieldName.substring(1);
String setName = "set" + stringLetter + fieldName.substring(1);
// 获取相应的方法
Method getMethod = classType.getMethod(getName, new Class[] {});
Method setMethod = classType.getMethod(setName,
new Class[] { field1.getType() });
for (FgJyptViewmodel proxy : viewmodelList) {
if (fieldName.equals(proxy.getViewValue())) {
// 为可视模板设置是否选中属性
setMethod.invoke(objectCopy, new Object[] { "true" });
}
}
}
return objectCopy;
}
public Object copy(Object obj) throws IllegalArgumentException,
SecurityException, InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
// 获得对象的类型
Class classType = obj.getClass();
System.out.println("该对象的类型是:" + classType.toString());
// 通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {});
// 获得对象的所有属性
Field[] fields = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
// 获取数组中对应的属性
Field field = fields[i];
String fieldName = field.getName();
String stringLetter = fieldName.substring(0, 1).toUpperCase();
// 获得相应属性的getXXX和setXXX方法名称
String getName = "get" + stringLetter + fieldName.substring(1);
String setName = "set" + stringLetter + fieldName.substring(1);
// 获取相应的方法
Method getMethod = classType.getMethod(getName, new Class[] {});
Method setMethod = classType.getMethod(setName, new Class[] { field
.getType() });
// 调用源对象的getXXX()方法
Object value = getMethod.invoke(obj, new Object[] {});
System.out.println(fieldName + " :" + value);
// 调用拷贝对象的setXXX()方法
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}
public static void main(String[] args) throws IllegalArgumentException,
SecurityException, InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
test1();
}
private static void test1() throws InstantiationException,
IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
Customer customer = new Customer();
customer.setName("hejianjie");
customer.setId(new Long(1234));
customer.setAge(19);
Customer customer2 = null;
customer2 = (Customer) new ReflectTester().copy(customer);
System.out.println(customer.getName() + " " + customer2.getAge() + " "
+ customer2.getId());
System.out.println(customer);
System.out.println(customer2);
}
/*
* test by me
*/
private static void test2() throws InstantiationException,
IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
FgJyptViewmodel fgJyptViewmodel = new FgJyptViewmodel();
FgJyptViewmodelForm fgJyptViewmodelForm = new FgJyptViewmodelForm();
List<String> list = new ArrayList<String>();
list.add("area");
list.add("address");
list.add("addresss");
FgJyptViewmodelForm proxy = (FgJyptViewmodelForm) new ReflectTester()
.copy2(fgJyptViewmodelForm, list);
System.out.println(proxy.getArea());
System.out.println(proxy.getAddress());
System.out.println(proxy.getAuditState());
}
}
class Customer {
private Long id;
private String name;
private int age;
public Customer() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
分享到:
相关推荐
在给定的"annotation-reflect-test"项目中,我们可以看到一个针对注解扫描和反射应用的实例。以下是这些知识点的详细说明: 1. **注解(Annotation)**: 注解是Java语言提供的一种元数据机制,它允许在代码中嵌入...
String result = (String) stringToUp.invoke(javaReflect, "java reflect test"); ``` 4. **`Constructor` 类**:代表类的构造器,与`Method`类似,可以用于动态创建对象实例。 5. **`Field` 类**:代表类的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。在"ReflectTest"这个测试中,我们将深入探讨如何使用反射来访问和操作类的属性、方法以及注解,同时也会...
Kevvy-Reflect是一个非常小的Java库,它通过使用代码生成(取决于ASM)来提供高性能的反射。 表现 ###现场反射: #####非私有字段 #####私人字段 ##### Bean字段,非私有字段和Java-Getter / Setter比较 ##### ...
关于Java注解的使用及其深度解析 Java注解(Annotation)是Java 5引入的一种元数据(metadata)机制,用于向代码中添加附加信息,这些信息可以被编译器或者运行时环境利用,进行代码分析、生成文档或者实现某些框架功能...
`java.lang.reflect.Proxy` 类是用于创建动态代理对象的工厂类。我们需要使用`Proxy.newProxyInstance()`方法,传入类加载器、接口数组以及自定义的`InvocationHandler`实例,来生成代理对象。 5. **动态代理示例*...
Java动态代理的核心是`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。下面详细介绍这两个核心组成部分: 1. **`Proxy`类**:提供了一系列静态方法用于创建代理对象,其中最常用的是`...
- `java.lang.reflect`:提供了用于获取类和对象的内部结构的信息,并操纵这些内部结构的方法。 - `java.sql`:提供连接数据库的接口和类,如`Connection`和`Driver`。 #### 十、基础类型与引用类型 - **基础类型*...
在深入理解这个概念之前,我们需要先了解一些基础的Java类库,特别是`java.lang.reflect`包中的类。 1. **Class类**:在Java中,每一个类都有一个与之对应的Class对象。`Class`类是反射的核心,它代表了一个类的...
- Java反射的核心API位于`java.lang.reflect`包下,包括`Constructor`、`Field`和`Method`等类。这些类提供了访问类构造器、字段和方法的能力。例如,通过`Method`类的`getMethod(String name, Class<?>... ...
在Java中,`java.lang.reflect`包提供了反射相关的类和接口,如Class、Constructor、Method和Field等。本示例“java reflection demo”将探讨如何利用反射进行动态加载和调用方法。 首先,让我们从“动态加载jar包...
7. **反射**:通过`java.lang.reflect`包,Java允许在运行时检查和操作类、接口和对象。反射是实现元编程的关键,可以动态获取类信息,创建对象,调用方法等。 8. **注解**:Java的注解(Annotation)是一种元数据...
我们这里主要讨论的是动态代理,它基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 在Java动态代理机制中,`Proxy`类是生成代理对象的工厂,而`InvocationHandler`接口定义了...
Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`InvocationHandler`接口定义了代理...
import scala.reflect.io.File import java.io.{BufferedReader, FileReader} import sun.awt.font.CascadingStyleSheet def isTraditionalChinese(char: Char): Boolean = { CascadingStyleSheet....
首先,要使用反射API,我们需要导入`java.lang.reflect`包中的几个关键类:`Class`、`Constructor`、`Method`和`Field`。这些类分别代表类对象、构造器对象、方法对象和字段对象。 1. **获取类对象**: 要使用反射...
- **`java.lang.reflect.Method`**:表示类的方法。 - **`java.lang.reflect.Field`**:表示类的成员变量。 - **`java.lang.reflect.Constructor`**:表示类的构造器。 这些类是Java反射机制的基础,它们提供了访问...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...
4. **替换原有注解**:使用`java.lang.reflect.Proxy`类创建一个代理对象,将新的代理注解与原始注解关联起来。这样,当我们通过反射访问注解时,实际上访问的是这个代理对象,从而实现了注解属性的动态修改。 需要...
Java提供了一个内置的API——`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,用于创建和管理动态代理。动态代理通常适用于需要为多个具有相同接口的对象创建代理的情况,可以减少代码的...