java反射机制的两个具体应用实例

1.实例一

package reflectjizhi;


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


    public static void main(String[] args) throws Exception
    {
        Customer customer = new Customer("Tom", 21);
        customer.setId(new Long(1));


        Customer customerCopy = (Customer) new ReflectTester().copy(customer);
        System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " "
                + customerCopy.getAge());
    }
}


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


import java.lang.reflect.Method;


public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
    }


    public String echo(String msg)
    {
        return "echo: " + msg;
    }


    public static void main(String[] args) throws Exception
    {
        Class<?> classType = InvokeTester.class;//.class找到这个类class的实例
        Object invokeTester = classType.newInstance();//new一个新的实例,返回值类型为object类型


        // Object invokeTester = classType.getConstructor(new
        // Class[]{}).newInstance(new Object[]{});
//我不知道方法中的具体实现,仅知道方法中的头的部分,由java反射机制中的具体方法和类,我也能够去实现这样的方法,深层次的话,还可以进行访问私有的方法,反射机制可以实现,
        // 调用InvokeTester对象的add()方法
        Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class });
        Object result = addMethod.invoke(invokeTester, new Object[] { new Integer(100), new Integer(200) });
        System.out.println((Integer) result);


        // 调用InvokeTester对象的echo()方法
        Method echoMethod = classType.getMethod("echo", new Class[] { String.class });//先拿到这个对象实例(本质就是这个方法)
        result = echoMethod.invoke(invokeTester, new Object[] { "Hello" });//然后我再去用invoke(执行函数)去执行里卖弄的东东
        System.out.println((String) result);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值