反射

xiaoxiao2021-02-28  38

什么是反射:反射就是通过获取class字节码文件对象/Class的类对象,获取该字节码文件对象中的成员变量,构造方法,和成员方法

 Field: 简称成员变量(Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。

 反射的字段可能是一个类(静态)字段或实例字段。)

 Constructor:简称构造方法:提供关于类的单个构造方法的信息以及对它的访问权限。

 Method:简称成员方法:类或接口上单独某个方法(以及如何访问该方法)的信息

 

 获取这个class字节码文件对象的三种方式:

  1)Object中的getClass()

 2)任何数据类型的静态属性class

 3)Class类中的方法:

 forName(String className)

 forName("类路径")

代码说明

public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { //如何获取class字节码文件对象 //创建Person对象 Person p1 = new Person() ; Class c1 = p1.getClass() ; //获取class字节码文件对象 Person p2 = new Person(); Class c2 = p2.getClass() ; System.out.println(p1==p2);//false System.out.println(c1==c2);//true System.out.println("------------------"); //数据类型的静态属性class Class c3 = Person.class ; System.out.println(c3==c2); //Class类中的方法:forName(String className) Class c4 = Class.forName("org.westos_01.Person") ; System.out.println(c4==c2); } }

通过字节码文件对象获取构造方法并使用.

1)先获取Person类的字节码文件对象

2)public Constructor<?>[] getConstructors()

Class 对象所表示的类的所有公共构造方法

3) public T newInstance(Object... initargs):initrgs:实际参数

代码说明:

public class ReflectDemo { public static void main(String[] args) throws Exception { //1)先获取Person类的字节码文件对象 Class c = Class.forName("org.westos_01.Person") ; //2)//public Constructor<?>[] getConstructors() //Class 对象所表示的类的所有公共构造方法 /** * public org.westos_01.Person(java.lang.String,int,java.lang.String) public org.westos_01.Person() */ //public Constructor<?>[] getDeclaredConstructors():获取当前字节码文件对象中的所有的构造方法 //Constructor[] cons = c.getConstructors() ; /** * public org.westos_01.Person(java.lang.String,int,java.lang.String) org.westos_01.Person(java.lang.String,int) private org.westos_01.Person(java.lang.String) public org.westos_01.Person() */ /*Constructor[] cons = c.getDeclaredConstructors() ; for(Constructor con : cons) { System.out.println(con); }*/ //如何获取单个的构造方法 //public Constructor<T> getConstructor(Class<?>... parameterTypes) //如果是无参的,不用写;如果是有参的,getContStructor方法中的参数是当前参数类型的静态属性class Constructor con = c.getConstructor() ; //public org.westos_01.Person() //获取当前构造的对象 //System.out.println(con); //public T newInstance(Object... initargs):initrgs:实际参数 //表示示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 Object obj = con.newInstance(); System.out.println(obj); }

通过反射获取构造方法并使用

1)获取Person类的字节码文件对象

2)获取单个构造方法(公共的,带三个参数的)

3)创建构造方法表示的该类的实例对象

代码说明

public class ReflectDemo2 { public static void main(String[] args) throws Exception { //1)获取Person类的字节码文件对象 Class c = Class.forName("org.westos_01.Person") ; //2)获取单个构造方法(公共的,带三个参数的) //public Constructor<T> getConstructor(Class<?>... parameterTypes) Constructor con = c.getConstructor(String.class,int.class,String.class) ; //System.out.println(con); //3)创建构造方法表示的该类的实例对象 Object obj = con.newInstance("高圆圆",27,"户县") ; System.out.println(obj); //Person [name=高圆圆, age=27, address=户县] } }

通过反射获取成员变量,并使用

1)获取Person类的字节码文件对象

2)获取当前字节码文件对象中的所有的公共的成员变量

public Field[] getDeclaredFields():获取当前字节码文件对象中所有的字段

通过获取成员方法并使用

1)通过反射获取Pereson字节码文件对象

Class c = Class.forName("org.westos_01.Person") ;

2) 获取当前字节码文件对象中的所有的公共的成员方法(包括父类中的)

public Method[] getMethods()

转载请注明原文地址: https://www.6miu.com/read-2621268.html

最新回复(0)