Java反射使用总结 (2)

获取构造函数的参数
获取到构造函数的对象之后,可以通过getParameterTypes()获取到构造函数的参数。

Constructor constructors = birdClass.getConstructor(new Class[]{String.class}); Class[] parameterTypes = constructors.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方法信息
下面代码是通过反射可以获取到该类的声明的成员方法信息:

Method[] metchods = birdClass.getMethods(); Method[] metchods1 = birdClass.getDeclaredMethods(); Method eatMetchod = birdClass.getMethod("eat", new Class[]{int.class}); Method eatMetchod1 = birdClass.getDeclaredMethod("eat", new Class[]{int.class});

无参的getMethods()获取到所有public修饰的方法,返回的是Method[]数组。
无参的getDeclaredMethods()方法到的是所有的成员方法,和修饰符无关。
对于有参的getMethods()方法,必须提供要获取的方法名以及方法名的参数。如果要获取的方法没有参数,则用null替代:

Method eatMetchod = birdClass.getMethod("eat", null);

无参的getMethods()和getDeclaredMethods()都只能获取到类声明的成员方法,不能获取到继承父类的方法。

获取成员方法参数

Class birdClass = Bird.class; Class[] parameterTypes = eatMetchod1.getParameterTypes();

获取成员方法返回类型

Class birdClass = Bird.class; Class returnType = eatMetchod1.getReturnType();

invoke()方法
java反射提供invoke()方法,在运行时根据业务需要调用相应的方法,这种情况在运行时非常常见,只要通过反射获取到方法名之后,就可以调用对应的方法:

Class birdClass = Bird.class; Constructor constructors1 = birdClass.getConstructor(); Method eatMetchod = birdClass.getMethod("eat", new Class[]{int.class}); System.out.println(eatMetchod.invoke(constructors1.newInstance(), 2));

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方法:

public static void printGettersSetters(Class aClass){ Method[] methods = aClass.getMethods(); for(Method method : methods){ if(isGetter(method)) System.out.println("getter: " + method); if(isSetter(method)) System.out.println("setter: " + method); } } public static boolean isGetter(Method method){ if(!method.getName().startsWith("get")) return false; if(method.getParameterTypes().length != 0) return false; if(void.class.equals(method.getReturnType()) return false; return true; } public static boolean isSetter(Method method){ if(!method.getName().startsWith("set")) return false; if(method.getParameterTypes().length != 1) return false; return true; }

获取成员变量
通过反射可以在运行时获取到类的所有成员变量,还可以给成员变量赋值和获取成员变量的值。

Class birdClass = Bird.class; Field[] fields1 = birdClass.getFields(); Field[] fields2 = birdClass.getDeclaredFields(); Field fields3 = birdClass.getField("age"); Field fields4 = birdClass.getDeclaredField("age");

getFields()方法获取所有public修饰的成员变量,getField()方法需要传入变量名,并且变量必须是public修饰符修饰。

getDeclaredFields方法获取所有生命的成员变量,不管是public还是private。

获取成员变量类型

Field fields4 = birdClass.getDeclaredField("age"); Object fieldType = fields4.getType();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfsjp.html