Java反射机制
一.概念
反射机制指的是程序在运行时能够获取自身的信息;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射机制的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
二.功能
-
在运行时判断任意一个对象所属的类;
-
在运行时构造任意一个类的对象;
-
在运行时判断任意一个类所具有的成员变量和方法(通过反射可以调用private方法);
-
在运行时调用任意一个对象的方法;
*注:前提为运行时而不是编译时
三.Java的反射机制的实现借助的类
- class:类对象
Constructor
:类的构造器对象- Field:类的属性对象
- Method:类的方法对象
四.反射机制的相关API
1.通过一个对象获得完整的包名和类名
1 package day170209; 2 3 public class fanshe01 { 4 public static void main(String[] args) { 5 fanshe01 f = new fanshe01(); 6 System.out.println(f.getClass().getName()); 7 8 // 结果:day170209.fanshe01 9 } 10 }
2.实例化Class类对象
1 package day170209; 2 3 public class fanshe02 { 4 public static void main(String[] args) throws Exception { 5 Class<?> class1 = null; 6 Class<?> class2 = null; 7 Class<?> class3 = null; 8 // 一般形式 9 class1 = Class.forName("day170209.fanshe02"); 10 System.out.println(class1); 11 class2 = new fanshe02().getClass(); 12 System.out.println(class2); 13 class3 = fanshe02.class; 14 System.out.println(class3); 15 16 // 结果:class day170209.fanshe02 17 // class day170209.fanshe02 18 // class day170209.fanshe02 19 } 20 }
3.获取一个对象的父类与实现的接口
1 package day170209; 2 3 public class fanshe04 { 4 public static void main(String[] args) throws Exception { 5 Class<?> clazz = Class.forName("pings.TestDog"); 6 // 取得父类 7 Class<?> parentClass = clazz.getSuperclass(); 8 System.out.println("clazz的父类为:" + parentClass.getName()); 9 // 获取所有的接口 10 Class<?> intes[] = clazz.getInterfaces(); 11 System.out.println("clazz实现的接口有:"); 12 for (int i = 0; i < intes.length; i++) { 13 System.out.println((i + 1) + ":" + intes[i].getName()); 14 } 15 16 // 结果:clazz的父类为:java.lang.Object 17 // clazz实现的接口有: 18 // 1:pings.Dog1 19 } 20 } 21 22 package pings; 23 24 public interface Dog1 { 25 public void show(); 26 } 27 28 package pings; 29 30 public class TestDog implements Dog1 { 31 32 @Override 33 public void show() { 34 System.out.println("aaas"); 35 } 36 37 }
4.通过反射机制实例化一个类的对象
1 package day170209; 2 3 import pings.Dog; 4 5 public class fanshe05 { 6 public static void main(String[] args) throws Exception { 7 Class<?> class1 = Class.forName("pings.Dog"); 8 // 实例化默认构造方法,调用set赋值 9 Dog dog = (Dog) class1.newInstance(); 10 dog.setId("11"); 11 dog.setName("旺财"); 12 System.out.println(dog); 13 14 // 结果:id:11 name:旺财 15 } 16 }
5.获取某个类的全部属性
1 package day170209; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Modifier; 5 6 public class fanshe03 { 7 public static void main(String[] rgs) throws Exception { 8 Class<?> clazz = Class.forName("pings.Dog"); 9 System.out.println("===============本类属性==============="); 10 // 取得本类的全部属性 11 Field[] field = clazz.getDeclaredFields(); 12 for (int i = 0; i < field.length; i++) { 13 // 权限修饰符 14 int mo = field[i].getModifiers(); 15 String priv = Modifier.toString(mo); 16 // 属性类型 17 Class<?> type = field[i].getType(); 18 System.out.println(priv + " " + type.getName() + " " 19 + field[i].getName() + ";"); 20 } 21 System.out.println("==========实现的接口或者父类的属性=========="); 22 // 取得实现的接口或者父类的属性 23 Field[] filed1 = clazz.getFields(); 24 for (int j = 0; j < filed1.length; j++) { 25 // 权限修饰符 26 int mo = filed1[j].getModifiers(); 27 String priv = Modifier.toString(mo); 28 // 属性类型 29 Class<?> type = filed1[j].getType(); 30 System.out.println(priv + " " + type.getName() + " " 31 + filed1[j].getName() + ";"); 32 } 33 34 /*===============本类属性=============== 35 private java.lang.String id; 36 private java.lang.String name; 37 ==========实现的接口或者父类的属性==========*/ 38 } 39 }
6.通过反射机制调用某个类的方法
1 package day170209; 2 3 import java.lang.reflect.Method; 4 5 public class fanshe06 { 6 public static void main(String[] args) throws Exception { 7 Class<?> clazz = Class.forName("day170209.fanshe06"); 8 // 调用TestReflect类中的reflect1方法 9 Method method = clazz.getMethod("reflect1"); 10 method.invoke(clazz.newInstance()); 11 // Java 反射机制 - 调用某个类的方法1. 12 // 调用TestReflect的reflect2方法 13 method = clazz.getMethod("reflect2", int.class, String.class); 14 method.invoke(clazz.newInstance(), 20, "张三"); 15 // Java 反射机制 - 调用某个类的方法2. 16 // age -> 20. name -> 张三 17 } 18 19 public void reflect1() { 20 System.out.println("Java 反射机制 - 调用某个类的方法1."); 21 } 22 23 public void reflect2(int age, String name) { 24 System.out.println("Java 反射机制 - 调用某个类的方法2."); 25 System.out.println("age -> " + age + ". name -> " + name); 26 } 27 /* 28 * Java 反射机制 - 调用某个类的方法1. Java 反射机制 - 调用某个类的方法2. age -> 20. name -> 张三 29 */ 30 }