关于Java反射的使用详解,Java反射使用详解
关于Java反射的使用详解,Java反射使用详解
什么是反射?
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改他状态或行为的一种能力。JAVA反射机制是在运行状态中,对于任何一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用他的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能成为Java语言的反射机制。简单的来说反射机制指的的是程序在运行是能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。
为什么用反射机制?
初次接触反射的概念,不经会想,直接创建对象不就可以了么,这里涉及到动态和静态的概念。静态编译:在编译时确定类型,绑定对象,即通过。
Student stu = new Student("zhangsan",30);
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多台的应用,用以降低类之间的耦合性。
Class.forName("com.Lct.Person.Student").newInstance();
一句话,反射机制的优点是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中。他的缺点是对性能的影响。使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作,所以什么时候使用反射,就要靠业务的需求、大小,以及经验的积累来决定。
反射机制的关键
Java的反射机制的实现要借助于class类和java.lang.reflect包下4个类: Constructor, Field, Method,Array
Class类 - 代表类的Class对象
Constructor类-代表类的构造方法
Field类-代表类的属性
Method类-代表类的方法
Array类 - 提供动态创建数组,以及访问数组元素的静态方法
通过前四个对象我们可以粗略的看到一个类的各个组成部分
Array类会在最后有所简述。
Java 反射机制主要提供了以下功能
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法
获取Class对象

代码示例(获取Class对象)
package com.Lct.classtype; public class ClassDemo { public static void main(String[] args) { //使用实例对象.getClass() /*Employee employee = new Employee("zhangsan", 18); Class<?> class1 = employee.getClass(); System.out.println(class1.getName()); System.out.println(class1.getSuperclass().getName());*/ //使用类名.Class /*Class<?> class1 = Employee.class; System.out.println(class1.getName()); System.out.println(class1.getSuperclass().getName());*/ //使用Class.forName("") /*try { Class<?> class1 = Class.forName("com.Lct.classtype.Employee"); System.out.println(class1.getName()); System.out.println(class1.getSuperclass().getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); }*/ //基本数据类型的Class对象 /* Class <?> class1 = int.class; System.out.println(class1.getName()); //基本数据类型没有父类,下面代码会报NullPointerException异常 //System.out.println(class1.getSuperclass().getName()); */ //包装类获取基本数据类型的Class对象 /* Class <?> class1 = Integer.TYPE; System.out.println(class1.getName()); //基本数据类型没有父类,下面代码同样会报NullPointerException异常 //System.out.println(class1.getSuperclass().getName()); */ //获取包装类的Class对象 Class <?> class1 = Integer.class; System.out.println(class1.getName()); System.out.println(class1.getSuperclass().getName()); } } class Employee { private String name; private int age; public Employee(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
主类
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test3 { public static void main(String[] args) throws Exception{ //加载类 Class a = Class.forName("com.liu.Student"); // java API 中也提供了getFields()方法,和getDeclaredFields()方法的区别是getFields方法只是返回共有的属性 //而getDeclaredFields方法返回所有属性,相似的还有getDeclaredMethods()、getDeclaredConstructors(); Field[] declaredFields = a.getDeclaredFields(); for (Field field : declaredFields) { System.out.println("属性:"+field); } //返回类的所有方法 Method[] declaredMethods = a.getDeclaredMethods(); for (Method method : declaredMethods) { System.out.println("方法:"+method); } //返回类的所有构造方法 Constructor[] declaredConstructors = a.getDeclaredConstructors(); for (Constructor constructor : declaredConstructors) { System.out.println(constructor); } //通过newInstance()方法可以获取一个Student对象,其中newInstance()方法是调用Student类的无参构造方法 Student stu = (Student) a.newInstance(); System.out.println(stu); Student stu1 = (Student) a.newInstance(); //获取一个名叫name的属性 Field declaredField = a.getDeclaredField("name"); //关闭访问检查,开启访问检查对代码运行速度会有很大的影响,所以建议在使用时关闭访问检查 declaredField.setAccessible(true); //为属性赋值 declaredField.set(stu1, "feifei"); System.out.println(stu1.getName()); Constructor declaredConstructor = a.getDeclaredConstructor(null); //通过构造方法对象的newInstance()方法获取一个Student对象 //注意参数为null则表示这个构造方法为无参构造方法 Student stu2 = (Student) declaredConstructor.newInstance(null); System.out.println(stu2); //创建一个有参构造方法的对象,参数为构造方法中的类型的Class类型 Constructor con = a.getDeclaredConstructor(String.class,int.class,String.class,String.class); //创建对象 Student stu3 = (Student) con.newInstance("liufei",29,"henansheng","123345456"); System.out.println(stu3.getAddress()+" "+stu3.getAge()+" "+stu3.getName()+" "+stu3.getPhone()); Student stu4 = (Student) a.newInstance(); //通过方法名可以获取一个方法的对象,第一个参数为方法名,第二个参数为参数类型的Class类型 Method declaredMethod = a.getDeclaredMethod("setName", String.class); //激活 declaredMethod.invoke(stu4, "feige"); System.out.println(stu4.getName()); } }
bean类
public class Student { private String name; private int age; private String address; private String phone; public Student(){ } public Student(String name, int age, String address, String phone) { super(); this.name = name; this.age = age; this.address = address; this.phone = phone; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
用户点评