zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Mac上如何用命令行修改proxy设置
    Mac上解决访问github慢问题
    Bootstrap布局
    ListView详解
    sql server命名规范
    表的管理与操作
    常用编程技巧和方法
    有联系的jQuery选择器
    sql基础查询语句
    数值特征
  • 原文地址:https://www.cnblogs.com/123456lala/p/6832972.html
Copyright © 2011-2022 走看看