Java反射

Java反射

通过Java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描
述Java对象本身信息的功能。简单来说,即拥有任何一个类,获取类中信息的一套机制。

获取类claas对象示例

   ReflectTest reflectTest =  new ReflectTest();
   Class reflect  = reflectTest.getClass(); // 获得class对象
   
   // 或者
  Class<ReflectTest> reflectTestClass = ReflectTest.class;  // 获得class对象

反射常用API方法清单

带declared的方法,获取class类中的类型,不带的则返回父类和子类中所有的类型
例如:

 ReflectTest reflectTest = new ReflectTest();

        Class reflect = reflectTest.getClass();

        Method[] methods = reflect.getMethods();

        for (Method method : methods) {
            System.out.println(method.getName());
        }

        System.out.println("===============获取DeclaredMethods");

        Method[] declaredMethods = reflect.getDeclaredMethods();

        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }

        /**
         * main
         * wait
         * wait
         * wait
         * equals
         * toString
         * hashCode
         * getClass
         * notify
         * notifyAll
         * ===============获取DeclaredMethods
         * main
         */

在这里插入图片描述

访问方法,简单示例

public class LionDemo{


    private String str;

    private int num, qty;

    public LionDemo() {
    }

    public LionDemo(String str, int num, int qty) {
        this.str = str;
        this.num = num;
        this.qty = qty;
    }

    public LionDemo(String... strings) {

        if (0 < strings.length) {
            num = Integer.parseInt(strings[0]);
        }

        if (1 < strings.length) {
            num = Integer.parseInt(strings[1]);
        }

        if (2 < strings.length) {
            qty = Integer.parseInt(strings[2]);
        }
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }
}
public class ConstructorLion {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        LionDemo lionDemo = new LionDemo("字符串1", 1, 2);

        Class<? extends LionDemo> demoClass = lionDemo.getClass();

        // 构造方法
        Constructor<?>[] declaredConstructors = demoClass.getDeclaredConstructors();
        for (Constructor<?> constructor : declaredConstructors) {

            System.out.println( "是否允许带有可变数量的参数:" + (constructor.isVarArgs() ? "是" : "否"));

            // 参数类型
            Class<?>[] parameterTypes = constructor.getParameterTypes();

            List<Class<?>> classes = Arrays.asList(parameterTypes);

            classes.forEach(i -> System.out.println(i+","));

        }

        // 获取成员变量
        Field[] declaredFields = demoClass.getDeclaredFields();


        for (Field field : declaredFields) {

            field.setAccessible(true);

            Class<?> type = field.getType();

            if (type.equals(int.class)){
                field.set(lionDemo, (int) (Math.random() * 10));
            }

            if (type.equals(String.class)){
                field.set(lionDemo, StringUtils.getRandomStr(3));
            }

            Object numValue = field.get(lionDemo);

            System.out.println(field.getName()+"字段值:"+numValue);
        }



    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值