获取构造函数的参数
获取到构造函数的对象之后,可以通过getParameterTypes()获取到构造函数的参数。
初始化对象
通过反射获取到构造器之后,通过newInstance()方法就可以生成类对象。
public class Alunbar { public static void main(String arts[]){ Class birdClass = Bird.class; try{ Constructor constructors = birdClass.getConstructor(new Class[]{String.class}); Bird bird = (Bird)constructors.newInstance("eat tea"); }catch(Exception e){ System.out.println("没有对应的构造函数"); } } class Bird { public Bird(){ } protected Bird(String eat){ } } }newinstance()方法接受可选数量的参数,必须为所调用的构造函数提供准确的参数。如果构造函数要求String的参数,在调用newinstance()方法是,必须提供String类型的参数。
获取Methods方法信息
下面代码是通过反射可以获取到该类的声明的成员方法信息:
无参的getMethods()获取到所有public修饰的方法,返回的是Method[]数组。
无参的getDeclaredMethods()方法到的是所有的成员方法,和修饰符无关。
对于有参的getMethods()方法,必须提供要获取的方法名以及方法名的参数。如果要获取的方法没有参数,则用null替代:
无参的getMethods()和getDeclaredMethods()都只能获取到类声明的成员方法,不能获取到继承父类的方法。
获取成员方法参数
Class birdClass = Bird.class; Class[] parameterTypes = eatMetchod1.getParameterTypes();获取成员方法返回类型
Class birdClass = Bird.class; Class returnType = eatMetchod1.getReturnType();invoke()方法
java反射提供invoke()方法,在运行时根据业务需要调用相应的方法,这种情况在运行时非常常见,只要通过反射获取到方法名之后,就可以调用对应的方法:
invoke方法有两个参数,第一个参数是要调用方法的对象,上面的代码中就是Bird的对象,第二个参数是调用方法要传入的参数。如果有多个参数,则用数组。
如果调用的是static方法,invoke()方法第一个参数就用null代替:
public class Alunbar { public static void main(String arts[]){ try{ Class birdClass = Bird.class; Constructor constructors1 = birdClass.getConstructor(); Method eatMetchod = birdClass.getMethod("eat", new Class[]{int.class}); System.out.println(eatMetchod.invoke(null, 2)); }catch(Exception e){ e.printStackTrace(); System.out.println("没有对应的构造函数"); } } } class Bird{ public static int eat(int eat){ return eat; } public Bird(){ } public Bird(String eat){ } private void talk(){} } class Animal{ public void run(){ } }使用反射可以在运行时检查和调用类声明的成员方法,可以用来检测某个类是否有getter和setter方法。getter和setter是java bean必须有的方法。
getter和setter方法有下面的一些规律:
getter方法以get为前缀,无参,有返回值
setter方法以set为前缀,有一个参数,返回值可有可无,
下面的代码提供了检测一个类是否有getter和setter方法:
获取成员变量
通过反射可以在运行时获取到类的所有成员变量,还可以给成员变量赋值和获取成员变量的值。
getFields()方法获取所有public修饰的成员变量,getField()方法需要传入变量名,并且变量必须是public修饰符修饰。
getDeclaredFields方法获取所有生命的成员变量,不管是public还是private。
获取成员变量类型
Field fields4 = birdClass.getDeclaredField("age"); Object fieldType = fields4.getType();