Java反射机制,简单来说就是在代码运行过程中能够获取当前类的信息。在Java语言中,只要给定了类的名字,就能够通过反射机制来获得类的所有信息。反射机制的优点是可以实现动态的创建对象和编译,灵活性很高。Java反射的应用场景是在编译时无法预知对象的实际运行时类型,程序只能依靠运行时信息来发现该对象和类的真实信息,这时候就使用反射。本文中给出的例子在Github:点击查看
获取Class对象
当类被加载过后,就会形成一个对应的class对象,通过这个class对象就可以访问JVM中的对应的这个类。获取class对象有三种方法,分别是:
- Class.forName()
- Object.getClass()
- 调用类的class属性,获取该类对应的class对象
举个例子吧,如下
Class<?> demoA = Class.forName("com.blyang.Person");
Class<?> demoB = new Person().getClass();
Class<?> demoC = Person.class;
System.out.println("A类名称:" + demoA.getName());
System.out.println("B类名称:" + demoB.getName());
System.out.println("C类名称:" + demoC.getName());
这里就是三种反射的实现。
而获取到类的实例之后,如何使用这个类的实例?实际上的使用无外乎获取这个类的变量,函数,或者是构造函数。
获取类的构造函数
获取类的构造函数的常用方法如下:
public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0
public Constructor
public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
public Constructor
举个例子吧,如下:
//获取该Class对象所对应类的全部构造器
//Constructor[] ctors = demoA.getDeclaredConstructors();
//获取Class对象对应的所有public构造器集合
Constructor[] ctors = demoA.getConstructors();
//获取任意指定的构造器
//Constructor ctor = demoA.getDeclaredConstructor(String.class, int.class);
//获取指定的public构造器
Constructor ctor = demoA.getConstructor(String.class, int.class);
for(Constructor c : ctors){
System.out.println(c);
}
System.out.println(ctor);
获取类的成员变量
public Field getDeclaredField(String name) 获取任意指定名字的成员
public Field[] getDeclaredFields() 获取所有的成员变量
public Field getField(String name) 获取任意public成员变量
public Field[] getFields() 获取所有的public成员变量
//获取所有成员变量
//Field[] fields = demoA.getDeclaredFields();
//获取所有public成员变量
Field[] fields = demoA.getFields();
//获取指定的任意成员变量
Field field = demoA.getDeclaredField("age");
//获取指定的public成员变量
//Field field = demoA.getField("age");
for(Field f : fields){
System.out.println(f);
}
System.out.println(field);
获取类的方法
public Method[] getMethods() 获取所有的共有方法的集合
public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合
public Method[] getDeclaredMethods() 获取所有的方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
同样来举个例子,如下:
//获取所有public方法集合
//Method[] methods = demoA.getMethods();
//获取所有方法集合
Method[] methods = demoA.getDeclaredMethods();
//获取指定的public方法
//Method method = demoA.getMethod("agePlus");
//Method method = demoA.getMethod("agePlus", int.class);
//获取指定的任意方法
//Method method = demoA.getDeclaredMethod("agePlusPrv");
Method method = demoA.getDeclaredMethod("agePlusPrv", int.class);
for(Method m : methods){
System.out.println(m);
}
System.out.println(method);
评论已关闭