Java教程

Java反射

本文主要是介绍Java反射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

什么是反射?  

  Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。

获取Class的三种方式

//1.通过类名.Class
Class c = Student.Class;
//2.通过classforName,引号里面是这个类所在的全限定名
Class c = Class.forName("");
//3.通过该类的对象创建
Student student = new Student();
Class c = student.Class;
获取该类及其从父类继承下来的所有公共public属性(c.getFields())
//获取该类的属性(包括继承来的)
Field[] fields = c.getFields();//获取该类及其父类中所有的public属性
     for (Field field : fields) {    //遍历属性
         System.out.println(field.getName());    //获取属性的名字
         System.out.println(field.getType());    //获取属性类型
         System.out.println(Modifier.toString(field.getModifiers()));    //获取属性的访问控制符对应的int值,在将这个int值转换成转换成控制符
        }

获得该类自定义-声明的属性(c.getDeclearFields())

//获取该类自己定义-声明的属性
Field[] declaredFields = c.getDeclaredFields();
for (Field declaredField : declaredFields) {
     System.out.println(declaredField.getName());    //获取属性的名字
     System.out.println(declaredField.getType());    //获取属性类型
}

获得该类定义的所有构造方法(c.getConstructors())

        Constructor[] constructors = c.getConstructors();
            for (Constructor constructor : constructors) {
            System.out.println(constructor.getName());
            System.out.println(constructor.getParameterCount());
            Parameter[] parameters = constructor.getParameters();//获得该构造方法的参数
            for (Parameter parameter : parameters) {
                System.out.println(parameter.getName());
            }
        }


Student student = (Student) constructors[1].newInstance(180,"张三",21);
//得到这个类的构造方法信息后,通过实例化创建一个Student对象
System.out.println(student.getName());

获得该类的普通方法

Method[] methods = c.getMethods();
for (Method method : methods) {
      System.out.println(method.getReturnType());
      System.out.println(method.getName());
}

System.out.println(methods[2].invoke(student, "lisi"));
//通过student这个对象调用这个对象里面的第三个方法,传入一个值是lisi
c.getMethod("study",String.class).invoke(student,"lisi");

这篇关于Java反射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!