java.lang.reflect反射学习

package com.solex.test;

import java.lang.reflect.*;
import java.util.Arrays;

import org.junit.Test;

public class TestClass {
    @Test
    public void TestRef() throws Exception {

        Class<?> c = null;
        c = Class.forName("java.lang.String");// 加载类
        System.out.println("类:" + c);

        String str = (String) c.newInstance();// 创建类实例
        System.out.println("一个类实例:" + str);

        Class<?>[] in = c.getInterfaces();// 获取类实现的接口
        System.out.println("类实现的接口:" + Arrays.toString(in));

        Class<?> su = c.getSuperclass();// 获取类的父类
        System.out.println("父类:" + su);

        Constructor<?>[] cons = c.getConstructors();// 获取类的构造方法
        System.out.println("构造方法:" + Arrays.toString(cons));

        Method[] mes = c.getMethods();// 获取类的方法
        System.out.println("方法:" + Arrays.toString(mes));

        Field[] fies = c.getDeclaredFields();// 获取类的属性
        System.out.println("属性:" + Arrays.toString(fies));

        /**
         * ----------------------
         */
        Person p = new Person("Zhang", 15);
        Class<? extends Person> cp = p.getClass();// 通过实例获取类
        try {
            Field ageField = cp.getDeclaredField("age");// 私有属性,需要设置可读
            ageField.setAccessible(true);
            Field nameField = cp.getField("name");// 公有属性

            int age = (Integer) ageField.get(p);// 表明要获取的ageField属性是属于p对象的
            String name = (String) nameField.get(p);// 表明要获取的nameField属性是属于p对象的
            System.out.println("name:" + name + ",age:" + age);
            /**
             * 利用反射调用方法,并测试调用之后,参数变化
             */
            Method methodAge = cp.getMethod("setAge", int.class);// 获取类的方法
            methodAge.invoke(p, 26);// 利用反射调用方法

            Method methodName = cp.getMethod("setName", String.class);// 获取类的方法
            methodName.invoke(p, "Jerry");// 利用反射调用方法

            age = (Integer) ageField.get(p);
            name = (String) nameField.get(p);// 表明要获取的p对象的f2属性
            System.out.println("name:" + name + ",age:" + age);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class Person {
    public String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.age = age;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("调用setName");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        System.out.println("调用setAge");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值