反射

一:类的加载

二:class的获取三种获取方法

三:class对象的功能

1:Field

package com.springboot.reflex;

import java.lang.reflect.Field;

/**
 * @author: 牧羊
 * @Date: 2020/4/4 12:57
 */
public class test {

    public static void main(String[] args) throws Exception {

        Class clazz = Person.class;

        //1:获取指定的public成员变量
        Field name = clazz.getField("name");

        //2:获取所有的public的成员变量
        Field[] fields = clazz.getFields();

        for (Field field : fields){
            System.out.println(field);
        }
        System.out.println("--------------------");

        //3:获取所有的成员变量
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field :declaredFields){
            System.out.println(field);
        }
        System.out.println("--------------------");

        //4:获取指定的成员变量
        Field phone = clazz.getDeclaredField("phone");
        
        //暴力反射,忽略修饰符的安全检查
        phone.setAccessible(true);

        //5:set
        Person person = new Person();
        phone.set(person,"18797813533");
        System.out.println(person);

        //6:get
        System.out.println(phone.get(person));


    }
}

2:构造方法

package com.springboot.reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @author: 牧羊
 * @Date: 2020/4/4 12:57
 */
public class test2 {

    public static void main(String[] args) throws Exception {

        Class clazz = Person.class;

        //1:获取public无参构造方法
        Constructor constructor = clazz.getConstructor();
        System.out.println(constructor);

        //2:获取public带参构造方法
        Constructor constructor1 = clazz.getConstructor();
        System.out.println(constructor1);

        //3:获取public所有的构造方法
        Constructor[] constructors = clazz.getConstructors();

        //4:获取指定的带参数构造方法
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, Integer.class);

        //5:获取所有的构造方法
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();

        //6:创建对象
        Object person = constructor.newInstance();
        System.out.println(person);

        //暴力反射
        declaredConstructor.setAccessible(true);
        Object person1 = declaredConstructor.newInstance("zhangsan", 22);
        System.out.println(person1);


    }
}

3:方法

package com.springboot.reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @author: 牧羊
 * @Date: 2020/4/4 12:57
 */
public class test3 {

    public static void main(String[] args) throws Exception {

        Class clazz = Person.class;

        //1:获取指定的public的不带参数方法
        Method eat = clazz.getMethod("eat");

        //2获取所有的public方法
        Method[] methods = clazz.getMethods();

        //3:获取指定的带参数方法
        Method eat1 = clazz.getDeclaredMethod("eat", String.class);

        //4:获取所有的方法
        Method[] declaredMethods = clazz.getDeclaredMethods();

        //5:执行方法
        Person p = new Person();
        eat.invoke(p);

        //暴力反射
        eat1.setAccessible(true);
        eat1.invoke(p,"zhangsan");

        //6:获取方法名称
        System.out.println(eat1.getName());

        //7:获取类名
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());



    }
}

四:案例

package com.springboot.reflex;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author: 牧羊
 * @Date: 2020/4/4 12:57
 */
public class test4 {

    public static void main(String[] args) throws Exception {

        //1:加载配置文件
        //创建Properties对象
        Properties properties = new Properties();

        //加载class文件下的配置文件
        ClassLoader classLoader = Person.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");

        properties.load(resourceAsStream);

        //2:获取配置文件下定义的参数
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");

        //3:加载类进内存
        Class<?> clazz = Class.forName(className);

        //4:创建对象
        Object obj = clazz.newInstance();

        //5:获取方法对象
        Method method = clazz.getMethod(methodName);

        //6:执行方法
        method.invoke(obj);

    }
}

五:面试题

https://blog.csdn.net/qq_37875585/article/details/89340495

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值