Java反射機制總結之二
阿新 • • 發佈:2019-01-31
1.要想使用反射,首先需要獲得待處理類或物件所對應的Class物件。
2.獲取某個類或物件所對應的Class地下的常用三中方法
3.若通過類的不帶引數的構造方法來生成物件,我們有兩種方式:
3.1
3.2
4.若想通過帶引數的構造方法生成例項,必須採用3.2的方法才可以。
5.ReflectTest類進一步演示了Reflection APIs的基本使用方法。ReflectTest類有一個copy(Object object)方法,這個方法能夠建立一個和引數object同樣型別的物件,然後把object物件中的所有屬性拷貝到新建的物件中,並將它返回。
這個程式碼示例只能複製簡單的JavaBean,假定JavaBean的每隔屬性都有public型別的getXXX()和setXXX()方法。
程式碼示例:
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- publicclass ReflectTest {
- //該方法實現對Customer物件的拷貝操作
- public Object copy(Object object)throws Exception{
- Class<?> classtype = object.getClass();
- //System.out.println(classtype.getName());
- // 使用空構造方法生成示例物件
- Constructor cons = classtype.getConstructor(new Class[]{});
- Object objectCopy = cons.newInstance(new Object[]{});
- //以上兩行等價於這一行:Object objectCopy = classtype.newInstance();
- //使用帶引數的構造方法生成示例物件
- //Constructor cons = classtype.getConstructor(new Class[]{String.class,int.class});
- //Object obj = cons.newInstance(new Object[]{"hello",3});
- Field[] fields = classtype.getDeclaredFields();
- for(Field field:fields){
- String name = field.getName();
- //將屬性的首字母轉化為大寫
- String firstLetter = name.substring(0, 1).toUpperCase();
- String getMethodName ="get"+firstLetter+name.substring(1);
- String setMethodName = "set"+firstLetter+name.substring(1);
- Method getMethod = classtype.getMethod(getMethodName, new Class[]{});
- Method setMethod = classtype.getMethod(setMethodName,new Class[]{field.getType()});
- Object value = getMethod.invoke(object, new Object[]{});
- setMethod.invoke(objectCopy, new Object[]{value});
- }
- return objectCopy;
- }
- publicstaticvoid main(String[] args)throws Exception{
- Customer customer = new Customer("Tom",20);
- customer.setId(1L);
- ReflectTest test= new ReflectTest();
- Customer customer2 = (Customer)test.copy(customer);
- System.out.println(customer2.getId()+","+customer2.getName()+","+customer2.getAge());
- }
- }
- class Customer{
- private Long id;
- private String name;
- privateint age;
- public Customer(){
- }
- public Customer(String name, int age){
- this.name = name;
- this.age = age;
- }
- public Long getId() {
- return id;
- }
- publicvoid setId(Long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- publicint getAge() {
- return age;
- }
- publicvoid setAge(int age) {
- this.age = age;
- }
- }
1,Tom,20
本文參考:
第六十三講 反射機制大總結:http://www.iqiyi.com/w_19rr26m6gp.html