2018-06-23学习小结 - 对象的引用与传递9

学习

17.6.2 反射的其他操作

如果类中只提供了有参构造方法,则就必须明确地调用指定的构造方法才可以通过反射实例化对象。

获取指定构造方法:

public Constructor getConstructor(Class... parameterTypes) throws NoSuchMethodException,SecurityException

在Constructor类之中提供有个实例化对象方法

public T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException

范例 17-12 调用构造方法取得实例化对象

package com.Javastudy2;

import java.lang.reflect.Constructor;

/**
 * @author Y.W.
 * @date 2018年6月23日 下午10:42:43
 * @Description TODO 调用构造方法取得实例化对象
 */
public class P451_17_12 {

    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("com.Javastudy2.Book11");
        Constructor cons = cls.getConstructor(String.class, double.class);
        Book11 book = (Book11) cons.newInstance("Java开发实战", 79.8);
        System.out.println(book);
    }

}

class Book11 {
    private String title;
    private double price;

    public Book11(String title, double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public String toString() {
        return "图书名称:" + this.title + ",价格:" + this.price;
    }
}

运行结果:

运行结果

此类中提供无参构造方法会更加方便,针对属性操作也明确给出了要求,需要利用setter和getter设置和取得,而且对其要求必须按照指定的格式编写,这也是因为反射机制。

使用Class类的以下方法取得方法的对象:

public Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException;

取得Method类的对象之后可以利用以下方法:

public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException;

范例 17-13 setter、getter的使用

package com.Javastudy2;

import java.lang.reflect.Method;

/**
 * @author Y.W.
 * @date 2018年6月23日 下午11:35:52
 * @Description TODO setter、getter的使用
 */
public class P452_17_13 {

    public static void main(String[] args) throws Exception {
        String filedName = "title"; // 要操作的属性
        String titleValue = "Java开发实战";
        Class cls = Class.forName("com.Javastudy2.Book12");
        Object obj = cls.newInstance(); // 产生对象可以分配堆内存
        Method setMethod = cls.getMethod("set" + initcap(filedName), String.class);
        Method getMethod = cls.getMethod("get" + initcap(filedName));
        setMethod.invoke(obj, titleValue); // 对象.setTitle()调用
        System.out.println(getMethod.invoke(obj)); // 对象.getTitle()调用
    }

    public static String initcap(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

}

class Book12 {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

运行结果:

运行结果

框架开发原理 = 反射机制 + XML 解析。

小结

目标类中构造函数有参无参对反射机制的具体使用方式是不太一样。


记于2018年6月24日00:23:52
By Yvan

你可能感兴趣的:(2018-06-23学习小结 - 对象的引用与传递9)