Java 反射

java 反射:
反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。
  1. 反射机制的功能
  Java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
生成动态代理。
  2. 实现反射机制的类
  Java中主要由以下的类来实现Java反射机制(这些类都位于java.lang.reflect包中):

Class类:代表一个类。 Field类:代表类的成员变量(成员变量也称为类的属性)。

Method类:代表类的方法。

Constructor类:代表类的构造方法。

Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

package com.reflect;

public class Customer {
private Long id;
private String name;
private int age;

public Customer() {}

public Customer(String name,int age) {
	this.name = name;
	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;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age=age;
}

}

package com.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTester {

public Object copy(Object object) throws Exception{
    //获得对象的类型
    Class classType=object.getClass();
    System.out.println("Class:"+classType.getName());

    //通过默认构造方法创建一个新的对象
    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 firstLetter=fieldName.substring(0,1).toUpperCase();
          //获得和属性对应的getXXX()方法的名字
          String getMethodName="get"+firstLetter+fieldName.substring(1);
          //获得和属性对应的setXXX()方法的名字
          String setMethodName="set"+firstLetter+fieldName.substring(1);

          //获得和属性对应的getXXX()方法
          Method getMethod=classType.getMethod(getMethodName,new Class[]{});
          //获得和属性对应的setXXX()方法
          Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});

          //调用原对象的getXXX()方法
          Object value=getMethod.invoke(object,new Object[]{});
          System.out.println(fieldName+":"+value);
          //调用拷贝对象的setXXX()方法
         setMethod.invoke(objectCopy,new Object[]{value});
    }
    return objectCopy;
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值