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 }
  • 相关阅读:
    FineAdmin.Mvc 使用ok-admin+ASP.NET MVC搭建的通用权限后台管理系统
    ASP.NET MVC Liu_Cabbage 个人博客
    ASP.NET MVC 通用角色权限管理系统
    js/jquery 判断节点是否存在
    jquery myscroll文字上下无缝滚动插件 简单使用
    使用DATEADD() DATEDIFF() 函数获取时间查询条件
    input 设置 display:none后 jquery无法给input赋值
    ASP.NET MVC QQ互联接入
    修改HTTPS加密协议TLS1.0为TLS1.2
    IIS设置网站为HTTPS并且将HTTP重定向到HTTPS
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10713561.html
Copyright © 2011-2022 走看看