上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了。自己的步伐全然被打乱了~不能继续被动下去。得又一次找到自己的节奏。
4、获取类的Constructor
通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例
Class<T>类提供了几个方法获取类的构造器。
public Constructor<T>
getConstructor(Class<?
>...
parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法
public Constructor<?>[]
getConstructors()
返回一个包括某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的全部公共构造方法
getDeclaredConstructor(Class<?
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法
getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的全部构造方法。它们是公共、保护、默认(包)訪问和私有构造方法
5、新建类的实例
通过反射机制创建新类的实例,有几种方法能够创建
调用无自变量ctor
1、调用类的Class对象的newInstance方法。该方法会调用对象的默认构造器,假设没有默认构造器。会调用失败.
Class<?> classType = ExtendType.class;
Object inst = classType.newInstance();
System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Default Constructor
com.quincy.ExtendType@d80be3
2、调用默认Constructor对象的newInstance方法
Class<?
> classType = ExtendType.class;
Constructor<?
> constructor1 = classType.getConstructor();
Object inst = constructor1.newInstance();
com.quincy.ExtendType@1006d75
调用带參数ctor
3、调用带參数Constructor对象的newInstance方法
> constructor2 =
classType.getDeclaredConstructor(int.class, String.class);
Object inst = constructor2.newInstance(1, "123");
ExtendType:Constructor with parameters
com.quincy.ExtendType@15e83f9
>[] constructors2 = clazzDog.getDeclaredConstructors();
for (Constructor<?
> m : constructors2)
{
System.out.println(m);
>[] types = m.getParameterTypes();
for (Class<?
> type : types) {
System.out.println(type);
}
System.out.println("-----------------new instance-------------------");
Constructor constructor = clazzDog.getDeclaredConstructor(String.class,int.class);
Dog dog = (Dog)constructor.newInstance("换换",2);
System.out.println(dog.name);
6、调用类的函数
通过反射获取类Method对象。调用Field的Invoke方法调用函数。
7、设置/获取类的属性值
通过反射获取类的Field对象,调用Field方法设置或获取值
Class clazzDog = Dog.class;
Object object = clazzDog.newInstance();
Field field = clazzDog.getDeclaredField("name");
field.set(object, "欢欢");
System.out.println(((Dog)object).name);