JAVA反射

一、概述

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

二、通过Class类对象获取构造方法对象

方法名说明
Constructor[] getConstructors()返回所有公共构造方法对象的数组
Constructor[] getDeclaredConstructors()

返回所有公共构造方法对象的数组

Constructor[] getDeclaredConstructors()返回所有公共构造方法对象的数组
Constructor getDeclaredConstructor(Class… parameterTypes)返回所有公共构造方法对象的数组

 1、创建一个类(写入成员变量、构造方法、成员方法)

public class BookServiceImpl implements BookService {
    //成员变量
    public String name;
    private String age;
    protected int year;
    double price;

    //构造方法
    public BookServiceImpl() {
    }

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

    protected BookServiceImpl(String name) {
        this.name = name;
    }

    private BookServiceImpl(String name, String age, int year, double price, BookDao bookDao) {
        this.name = name;
        this.age = age;
        this.year = year;
        this.price = price;
        this.bookDao = bookDao;
    }

    //成员方法
    public int vion(int n,String s){
        return 0;
    }
    private String fun(int n){
        return "";
    }
}

 2、方法的使用

public class Test01 {
    public static void main(String[] args) throws Exception {
        //通过全类名加载类的Class对象
        Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
        //Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法

        //获取类里面的所有被public修饰的构造方法---获取被公共的修饰符修饰的构造方法
        Constructor[] constructors = cla.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("----------------------------------------");
        //获取类里面的所有的构造方法---获取类里面所有的构造方法
        Constructor[] declaredConstructors = cla.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
    }
}

输出结果如下:

 三、通过Class类对象获取成员变量对象

方法名说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象

方法的示例代码:

public class Test01 {
    public static void main(String[] args) throws Exception {
        //通过全类名加载类的Class对象
        Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
        //Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法

        //获取类里面的公共属性---只能获取public修饰的属性
        Field[] fields = cla.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("----------------------------------");
        //获取类里面的所有属性(public、private、protected、默认属性)
        Field[] declaredFields = cla.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("-----------------------------------");
        //根据name获取公共的成员方法
        Field name = cla.getDeclaredField("name");
        System.out.println(name);
        //根据age获取成员方法(可以获取到被所有修饰符修饰的成员变量)
        Field age = cla.getDeclaredField("age");
        System.out.println(age);
    }
}

输出结果如下:

 四、通过class类对象获取成员方法对象

方法名说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的

方法的示例代码:

public class Test01 {
    public static void main(String[] args) throws Exception {
        //通过全类名加载类的Class对象
        Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
        //Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法

        //获取类里面所有被public修饰符修饰的方法
        Method[] methods = cla.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("----------------------------------------------");
        //获取类里面所有的方法
        Method[] declaredMethods = cla.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
    }
}

输出结果如下:

 五、通过 .properties配置执行对应的方法

实现代码如下:

1、创建 info.properties文件

className=com.dou.service.impl.BookServiceVip
methodName=fun

2、创建测试类

public class Test03 {
    public static void main(String[] args) throws Exception {
        //1.加载ser根目录下的 info.properties 文件
        InputStream stream = Test03.class.getClassLoader().getResourceAsStream("info.properties");
        //2.实例化工具包对象
        Properties properties = new Properties();
        //3.加载stream流对象
        properties.load(stream);
        //4.根据key获取对应的值
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        //5.通过全类名获取类的Class对象
        Class cla = Class.forName(className);
        //6.通过Class对象获取类的无参构造器
        Constructor constructor = cla.getDeclaredConstructor();
        //7.使用构造器创建对象
        BookService bookService = (BookService) constructor.newInstance();
        //8.获取方法名
        Method method = cla.getDeclaredMethod(methodName);
        //9.执行方法
        method.invoke(bookService);
    }
}

输出结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值