zoukankan      html  css  js  c++  java
  • 反射机制

    反射机制:在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;

    对于任意一个对象,都能够调用它的任意一个方法;

    这种动态获取的信息以及动态调用对象的方法的功能称Java的反射机制

    反射相关的API在java.lang包下

    Filed类:代表类的成员变量(类的属性)

    Method类:代表类的方法

    Constructor类:代表类的构造方法

    Array类:提供了动态创建数组,以及访问数组的元素的静态方法

    类反射

    获得Class类对象三种方法:

    (1)使用Class.forName("全路径");

    (2)使用.class方法,只适合在编译前就知道操作的类

    Class c=String.class;

    (3)使用类对象的getClass()方法

    String str=new String("Hello");

    Class c=str.getClass();

    字段反射

    跟构造方法一样有四种**

    Field[] fields=c.getFields();-----可遍历

    方法反射

    跟构造方法一样有四种**

    Method[] methods=c.getMethods();----可遍历

    getMethod("方法名",参数类型);----m.invoke(实例化对象,"参数")方法调用得到的方法

    构造函数反射--构造方法无返回值

    获得所有的公有的构造方法:Constructor[] ctrs=c.getConstructors();

    获得指定参数类型的公有的构造方法:Constructor c1=c.getConstructor(new Class[]{String.class,int.class});

    获得所有类型的构造方法:Constructor[] cttrs2=c.getDeclaredConstructors();

    获得指定任何类型的构造方法:Constructor c2=c.getDeclardConstructor(new Class[]{new String.class});

    反射对象的创建

    newInstance();通过类的不带参数的构造方法创建这个类的一个实例对象。

    Class<?> c=null;

    例如1:c=Class.forName("xxx.Person");

    Constructor ctr=c.getConstructor(new Class[] {String.class, int.class});

    Person p=(Person)ctr.newInstance("谢军帅",20);//创建并实例化一个对象

    2.c=Class.forName("xxx.Person");

    Person p=(Person)c.newInstance();

    反射字段的访问

    数组反射

    Array类--->对数组的操作

    eg:Array.getLength(数组的引用);

    isArray();

    使用Array类遍历数组Array.get(数组名,下标);

     1 package Xie;
     2 
     3 import java.lang.reflect.Array;
     4 
     5 public class ArrayDemo {
     6 
     7     public static void main(String[] args) {
     8         Person[] persons=new Person[] {
     9                 new Person("张三",19),
    10                 new Person("李四",28),
    11                 new Person("王五",17)
    12         };
    13         System.out.println("数组的长度:"+Array.getLength(persons));
    14         Class<? extends Person[]> c=persons.getClass();
    15         System.out.println(c.isArray());
    16         //使用Array类遍历数组
    17         for(int i=0;i<Array.getLength(persons);i++) {
    18             System.out.println(Array.get(persons, i));
    19         }
    20     }
    21 }

    使用反射得到一个对象

    (1)获取类Class对象实例

    Class c=Class.forName("全类名");

    (2)根据Class对象实例获取Constructor对象

    (3)使用Constructor对象的newInstance方法获取反射类对象

     1 package Xie;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 public class DynamicinstanceDemo {
     6 
     7     public static void main(String[] args) {
     8         Class<?> c=null;
     9         try {
    10             c=Class.forName("Xie.Person");
    11             Constructor<?> ctrs=c.getConstructor(new Class[] {String.class,int.class});
    12             Person p=(Person) ctrs.newInstance("谢军帅",18);
    13             System.out.println(p.toString());
    14         } catch (Exception e) {
    15             e.printStackTrace();
    16         }
    17     }
    18 }
  • 相关阅读:
    剑指 Offer 46. 把数字翻译成字符串
    剑指 Offer 45. 把数组排成最小的数
    1319.连通网络的操作次数-并查集
    数字序列中某一位的数字
    989.数组形式的整数加法
    java多线程
    剑指offer 48 -最长不含重复字符的子字符串 动态规划
    springboot 使用 lombok插件中的@data 注解
    netty 转发服务
    在静态方法中获取properties /yml 配置文件中的信息
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10713561.html
Copyright © 2011-2022 走看看