java反射的使用
java反射的使用
1 什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。
2 反射机制
Java反射机制主要提供了以下功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
3 Class对象
class对象是Reflection故事起源。要想操纵类中的属性和方法,都必须从获取Class对象开始
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生与之对应的一个Class对象。
Class类没有公共构造方法。Class对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。
4 java.lang.reflect
java.lang.reflect包下:
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
代码展示
package com.oracle.test; public class Employee { static String name; private static int age; public Employee() { System.out.println("无参数构造方法"); } public Employee(String name, int age) { super(); this.name = name; this.age = age; } public String toString() { return "hello,my name is " + name + "," + age + " years old"; } private void work(String name,int age) { this.name=name; this.age=age; System.out.println("working..."+name+"年龄为"+age); } }
利用反射技术,得到上面实体类的属性方法以及构造方法,并对该类中的方法进行调用
package com.oracle.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; /** * 反射的测试 * @author jacks.li * */ public class TestReflact { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Class<?> clazz = Class.forName("com.oracle.test.Employee"); //获取构造方法 Constructor<?> conStr = clazz.getConstructor(String.class,int.class); //根据获得的构造方法获得实例 Employee employee = (Employee) conStr.newInstance("jacks.li",18); System.out.println(conStr); //获取声明的属性 Field[] declaredFields = clazz.getDeclaredFields(); for(Field field:declaredFields ){ System.out.println("属性的名称"+field.getName()+"属性的修饰"+field.getModifiers()+"获取属性类型" +field.getType()); } //获得声明的方法 /* Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method method:declaredMethods){ System.out.println("获得方法名称"+method.getName()); System.out.println("获得方法返回类型"+method.getReturnType()); System.out.println("获得方法修饰"+method.getModifiers());//0代表默认权限、1代表public、2代表private(static,final也都是修饰) System.out.println("获得方法的参数"+Arrays.toString(method.getParameters())); }*/ //方法的调用 Method workMethod = clazz.getDeclaredMethod("work", String.class,int.class); workMethod.setAccessible(true); workMethod.invoke(employee, "jacks.li",19); } }

浙公网安备 33010602011771号