有为lala

导航

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 }

 

 

posted on 2017-05-09 22:06  有为lala  阅读(131)  评论(0编辑  收藏  举报