JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
1.运用 getClass():Object类中的方法,每个类都拥有此方法
2.运用 Class.getSuperclass():Class类中的方法,返回该Class的父类的Class
在运行中调用method方法
Obeject[]放置自变量,然后调用Method对象的invoke(Object obj,Object[])方法。
在运行中调用Field内容
便可以直接调用Field的 get(Object obj)和set(Object obj,Object value)方法
相关代码
- package
cn.com.reflection; -
- import
java.lang.reflect.Field; - import
java.lang.reflect.InvocationTargetExceptio n; - import
java.lang.reflect.Method; -
- public
class ReflectTester { -
-
-
public Object copy(Object obj) throws IllegalArgumentException , SecurityException, InstantiationException, IllegalAccessException, InvocationTargetExceptio n, NoSuchMethodException{ -
-
//获得对象的类型 -
Class classType=obj.getClass(); -
System.out.println("该对象的类型是:"+classType.toString()); -
-
//通过默认构造方法去创建一个新的对象,视其参数决定调用哪个构造方法 -
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); -
//获得对象的所有属性 -
Field[] fields=classType.getDeclaredFields(); -
-
for(int i=0;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, InvocationTargetExceptio n, 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); -
-
-
} -
- }
-
-
- 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; -
} -
- }
-
java 代码
- package
cn.com.reflection; -
- import
java.lang.reflect.Array; -
- public
class ArrayTester1 { -
-
-
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); -
} -
-
} -
- }