Java类反射中所必须的类:
Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
package example1;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTester {
/**
* 在这个类里面存在有copy()方法,根据指定的方法的参数去 构造一个新的对象的拷贝 并将他返回
*
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
*/
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();
//
System.out.println("公有属性:"+classType.getFields()[0]);
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 });
System.out.println("调用拷贝对象的get方法:" + fieldName + " :" + getMethod.invoke(objectCopy, new Object[] {}));
}
Method[] m = classType.getMethods();
for (int i = 0; i < m.length; i++) {
// 输出方法的返回类型
System.out.print(m[i].getReturnType().getName());
// 输出方法名
System.out.print(" " + m[i].getName() + "(");
// 获取方法的参数
Class[] parameterTypes = m[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
System.out.print(parameterTypes[j].getName());
if (parameterTypes.length > j + 1) {
System.out.print(",");
}
}
System.out.println(")");
}
return objectCopy;
}
public static void main(String[] args) throws IllegalArgumentException,
SecurityException, 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);
}
}
Customer类
package example1;
public class Customer {
public String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
private Long id;
private String name;
private int age;
public Customer(){
}
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
利用反射创建数组
package example2;
import java.lang.reflect.Array;
public class ArrayTester1 {
/**
* 此类根据反射来创建 <br/>
* 一个动态的数组
*/
public static void main(String[] args) throws ClassNotFoundException {
Class classType = Class.forName("java.lang.String");
Object array = Array.newInstance(classType, 10); // 指定数组的类型和大小
// 对索引为5的位置进行赋值
Array.set(array, 5, "hello");
String s = (String) Array.get(array, 5);
System.out.println(s);
// 循环遍历这个动态数组
for (int i = 0; i < ((String[]) array).length; i++) {
String str = (String) Array.get(array, i);
System.out.println(str);
}
}
}
更多参考开心购的交流专区
分享到:
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制
1. Java反射机制 1. 类名.class ,如: com.anbai.sec.classloader.TestHelloWorld.class 3. 反
JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用
java反射机制原理和反射机制总结!!! java反射机制原理和反射机制总结!!!
Java反射机制Java反射机制Java反射机制Java反射机制
反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...
java反射机制源码java反射机制源码java反射机制源码
描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。
Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了
java反射机制和动态代理的原理,熟悉反射机制和动态代理
一个例子8个demo让你了解Java反射机制
java 反射机制深入理解,java 反射机制深入理解,java 反射机制深入理解,
Java反射机制的实现_Reflection,适合学习了解反射机制。
Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。 所有文章均从网络途径获得,本人只作收集整理的工作,个别地方有改动。每篇文章的标题遵循原作者的表述,本人不再作任何更改。 关键字有:...
候捷谈Java反射机制 有助深入理解Java新特性
Java反射机制总结(实例分析) Java反射机制学习笔记
Java中的反射机制Java中的反射机制Java中的反射机制
深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破