反射机制

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

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

这种动态获取的信息以及动态调用对象的方法的功能称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 }
原文地址:https://www.cnblogs.com/xjs1874704478/p/10713561.html