blyang 你长的很好看啊~
Java反射
发表于: | 分类: Java | 评论:0 | 阅读: 8861

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 getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合

public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有

public Constructor getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器

举个例子吧,如下:

 
//获取该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); 


评论已关闭

TOP