java学习----反射

 目录

 1.什么是反射java

  2.反射的运用jvm

  3.总结ide

 

1、什么是反射

  反射:反射是指计算机程序在运行时(Run time)能够访问、检测和修改它自己状态或行为的一种能力   ----by  维基百科this

  java中的反射也是如此,利用反射的原理咱们能够在程序运行时候的可以动态的建立对象,而且调用对象的方法和属性spa

  它的做用是:1.在运行时判断任意一个对象类型code

        2.在运行时候可以构造任意一个对象对象

        3.在运行时候判断一个类的属性和方法blog

  反射在实际开发中的运用主要是在编写第三方jar包中比较多。咱们能够运用反射对程序进行反编译。生命周期

2、反射的运用

  上面涉及到反射是在java程序运行时才出现的。咱们知道java程序运行的机制是先编译再运行。开发

  编译后咱们会获得一个以.class结尾的字节码文件。咱们要运行一个java程序,只须要这个文件+JVM虚拟机便可

  那么就简单了解一下jvm的类加载机制(类的生命周期)吧

 

  

  在java中反射的核心类是Class类

  接下来就看看反射的核心类Class吧。

   建立反射(Class)对象有三中方法

  1.Class.forName(全路径名);

    2.类型  对象名 = new 类型();

   对象名.getClass();

  3.类名.class;

 ps:该类型无论建立多少个对象,经过对象

获取的Class对象,都是同一个。

下面看一个反射的实例吧:

  

package com.demo.forname; public class Student { private String name; private Integer id; public int age; private Student(int id){ this.id=id; } public Student(){ System.out.println("执行了无参的构造方法"); } public Student(String name, Integer id, int age) { super(); this.name = name; this.id = id; this.age = age; } @Override public String toString() { return "Student [name=" + name + ", id=" + id + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
须要进行反射操做的类
package com.demo.forname; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectNewObject { public static void main(String[] args) throws Exception { //获取反射对象
        Class<Student> obj = (Class<Student>) Class.forName("com.demo.forname.Student"); //调用无参构造方法
        Student stu1 = obj.newInstance(); //选择须要调用的构造方法
        Constructor constructor = obj.getConstructor(String.class,Integer.class,Integer.TYPE); //有Constructor对象调用构造方法
        Student stu2 = (Student)constructor.newInstance("张三",23,23); System.out.println(stu2); //------------------------------------------------------------------------------------ //获取全部的属性(只含公开属性,包含父类的属性)
        Field[] f = obj.getFields(); for (Field field : f) { System.out.println(field); } System.out.println("-----------------------------"); //获取指定字段的属性(只包含公开属性,包含父类的属性)
        Field f3 = obj.getField("name"); System.out.println(f3); System.out.println("-----------------------------"); //获取当前类中指定的属性(只包含本类)
        Field f4 = obj.getDeclaredField("name"); System.out.println(f4); System.out.println("----------------------------"); //获取本类全部的属性
        Field[] f2 = obj.getDeclaredFields(); for (Field field : f2) { System.out.println(field); } System.out.println("****************************"); //------------------------------------------------------------------------------------- //获取全部的方法(只包含公开的,包含父类(别忘了Object类中的方法))
        Method[] m1 = obj.getMethods(); for (Method method : m1) { System.out.println(method); } System.out.println("****************************"); //获取本类中全部的方法(不包含父类)
        Method[] m2 = obj.getDeclaredMethods(); for (Method method : m2) { System.out.println(method); } System.out.println("****************************"); //获取指定方法(须要公开的方法,不包含父类)后面的参数类型写该方法的参数的Class对象,若是没有就写null或不写
        Method m3 = obj.getMethod("toString"); System.out.println(m3); //获取当前类中的指定方法(全部方法)
        System.out.println("****************************"); Method m4 = obj.getDeclaredMethod("tec",int.class,String.class); //因为这里的m4方法是私有的这里利用反射咱们可让方法变成公开的来执行
        m4.setAccessible(true); System.out.println(m4); //调用方法(,这里方法没有参数则写null,可是第一个参数必须是这个方法的对象)
        m4.invoke(stu1,1,"789"); } }
利用反射运行代码

 

三、总结

  java反射机制因为是在编译后且是在JVM运行时进行的操做,因此咱们能够运用反射完成日常作不到的事。好比:集合里放不一样的类型、调用私有的方法等等。

这里java的优点就体现出来了----增长了代码的灵活性可是因为java反射的这些代码还要从新进行编译,因此利用反射写出来的代码运行效率是很低的,而且利用反射

写代码是很是繁琐的。因此善用java反射才能写出更好的代码。

相关文章
相关标签/搜索