您的位置:首页 > 职场人生

黑马程序员--java基础--反射

2015-08-03 19:49 621 查看
-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

 Java允许我们从多种途径为一个类class生成对应的Class对象

1.运用 getClass():Object类中的方法,每个类都拥有此方法

                                String str="abc";

                                Class cl=str.getClass();

2.运用 Class.getSuperclass():Class类中的方法,返回该Class的父类的Class

         --运用 Class.forName()静态方法

         --运用 ,Class:类名.class

在运行中调用method方法

 这个动作首先准备一个Class[]{}作为getMethod(String name,Class[])方法的参数类型,接下来准备一个

Obeject[]放置自变量,然后调用Method对象的invoke(Object obj,Object[])方法。

在运行中调用Field内容

  变更Field不需要参数和自变量,首先调用Class的getField()并指定field名称,获得特定的Field对象后

便可以直接调用Field的 get(Object obj)和set(Object obj,Object value)方法

相关代码

package cn.com.reflection;
  

  

import java.lang.reflect.Field;
  

import java.lang.reflect.InvocationTargetException;
  

import java.lang.reflect.Method;
  

  

public class ReflectTester {
  

  

      

    public Object copy(Object obj) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, 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, 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);   

           

  

    }   

  

}   

  

  

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);   

        }   

  

    }   

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: