阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第23章:反射与类操作:课时105:反射调用构造方法(含关系图-重要)
在一个类之中除了有继承的关系之外最为重要的操作就是类中的结构处理了,而类中的结构里面首先需要观察的就是构造方法的作用问题,实际上在之前通过反射实例化对象的时候就已经接触到了构造方法的问题了:
实例化方法替代:clazz.getDeclaredConstructor().newInstance();
所有类的构造方法的获取都可以直接通过Class类来完成,该类中定义有如下的几个方法;
获取所有构造方法:public Constructor<?>[] getDeclaredConstructors() throws SecurityException;
获取指定构造方法:public Constructor getDeclaredConstructor(Class<?>… parameterTypes) throws NoSuchMethodException, SecurityException;
获取所有构造方法:public Constructor<?>[] getConstructors() throws SecurityException;
获取指定构造方法:public Constructor getConstructor(Class<?>… parameterTypes) throws NoSuchMethodException, SecurityException。
范例:修改Person类的定义
package cn.mldn.abs;
public abstract class AbstractBase {
public AbstractBase() {}
public AbstractBase(String msg) {}
}
package cn.mldn.vo;
import cn.mldn.abs.AbstractBase;
import cn.mldn.service.IChannelService;
import cn.mldn.service.IMessageService;
public class Person extends AbstractBase implements IMessageService,IChannelService {
public Person() {}
public Person(String name,int age) {}
// 其它操作略
}
范例:获取构造
package cn.mldn.demo;
import java.lang.reflect.Constructor;
import cn.mldn.vo.Person;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Person.class;// 获取指定类的class对象
Constructor<?>[] constructors = cls.getDeclaredConstructors(); // 获取全部构造
for (Constructor<?> cons : constructors) {
System.out.println(cons);
}
}
}
此时获取的是类之中的全部构造方法,但是也可以获取一个指定参数的构造,例如:现在的Person类之中提供有两个构造:
public class Person extends AbstractBase implements IMessageService,IChannelService {
private String name;
private int age;
public Person() {}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:" + this.name + "、年龄:" + this.age;
}
此时程序打算调用Person类之中的有参构造方法进行Person类对象的实例化处理,这个时候必须指明要调用的构造,而后通过Constructor类之中提供的实例化方法操作:public T newInstance(Object… initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
范例:调用指定构造实例化对象
package cn.mldn.demo;
import java.lang.reflect.Constructor;
import cn.mldn.vo.Person;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Person.class;// 获取指定类的class对象
Constructor<?> constructor = cls.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小强",78); // 实例化对象
System.out.println(obj);
}
}
虽然程序代码本身允许开发者调用有参构造处理,但是如果从实际的开发来讲,所有的使用反射的类中最好提供有无参构造,因为这样的实例化可以达到统一性。
推荐阅读
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时111:单级属性赋值
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时102:反射与工厂设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第26章:反射与代理设计模式:课时118:动态代理设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第23章:反射与类操作:课时105:反射调用构造方法(含关系图-重要)
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时110:属性自动赋值实现思路