学习
17.6.2 反射的其他操作
如果类中只提供了有参构造方法,则就必须明确地调用指定的构造方法才可以通过反射实例化对象。
获取指定构造方法:
public Constructor<T> 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