-
在运行时动态地获取和使用类的信息的机制,在Java中可以使用反射API来获取类的构造函数并进行调用
-
对一个类、对象进行提供一个反射的机制
-
判断任意一个对象的属性
-
构造任意一个类的对象
-
判断任意一个类的所有成员变量和方法
-
任意的调用一个对象中的成员和方法
-
生成动态的代理(*)
-
-
Constructor 构造函数
-
Method 类的方法
-
Field 成员变量
-
Class 一个类
-
获取类对象: 首先需要获取要使用的类的
Class
对象,有以下几种方式来获取类对象:-
使用
Class.forName("类名")
方法:通过类的全限定名获取类对象。 -
使用
类名.class
:直接通过类字面常量获取类对象。 -
使用
对象.getClass()
:通过已经存在的对象获取类对象。
-
public static void main(Stirng[] args){ //方式一 Person person = new Person(); Class<? extends Person> aClass = person.getClass(); //方式二 Class<Person> personClass = Person.class; //方式三 Class<?> aClass1 = Class.forName("com......Person"); System.out,println("aClass==personClass = " + (aClass == personClass)); System.out,println("personClass == aClass = " + (personClass == aClass)); System.out,println("aClass==aClass1 = " + (aClass == aClass1)); //结果都为true }
-
通过反射方式调用构造函数以及获取构造函数中的参数列表
-
获取构造函数对象: 通过类对象获取要调用的构造函数对象,可以使用以下方法:
-
getConstructor(Class<?>... parameterTypes)
:根据参数类型获取公共的构造函数。 -
getDeclaredConstructor(Class<?>... parameterTypes)
:根据参数类型获取任意访问权限的构造函数,包括私有的构造函数。
-
public static void main(String[] args) throws Exception{ HelloWorld hello = new HelloWorld(); hello.getVoid01(); } public void getVoid01(){ Class personClass = Person.class; //调用对应的构造函数 Constructor constructor = personClass.getConstructor(String.class,String.class); Person p = (Person)constructor.newInstance("老哥","兄弟"); System.out.println("p = " + p); } //获取构造函数中的参数列表 public void getVOid02(){ //获取构造函数中的参数列表 Class personClass = Person.class; //调用对应的构造函数 Constructor[] constructors = personClass.getCOnstructors(); Constructor[] declareConstructors = personClass.getDeclaredConstructors(); for(Constructor declareConstructor : deClareConstructors){ System.out.println(deClareConstructor.getName()); System.out.print("("); //获取对应的类型 Class[] parameterTypes = declaredConstructor.getParameterTypes(); for(Class parameterType : parameterTypes){ System.out.print(parameterType.getName() + " "); } System,out.print(")"); System,out.println(""); } }
反射获取属性和方法
-
创建实例: 通过构造函数对象调用
newInstance(Object... initargs)
方法来创建类的实例,传入相应的构造函数参数。如果构造函数没有参数,可以直接调用newInstance()
方法。 -
获取构造函数
public void getVoid03(){ Class<Person> personClass = Person.class; //获取公开的 Constructor<?>[] constructors = personClass.getConstructors(); //获取所有的,包括私有 Construtor<?> declareConstructors = personClass.getDeclaredConstructors(); for(Constructor<?> constructor : declareConstructors){ System.out.print(construcotr.getName() + "( "); Class<?>[] parametterTypes = constructor.getParameterTypes(); for(Class<?> parameterType : parameterTypes){ System.out.println(parameterType.getName() + " "); System.out.print(") "); System.out.println(" "); } }
-
获取对应的方法
public void getVoid03() throws Exception{ Class<Person> personClass = Person.class; //获取公开的 Method[] methods = personClass.getMethods(); //获取私有的 Method[] declaredMethods = personClass.getDeclaredMethods(); for(Method method : methods){ System.out.println(method.getName()); if(method.getName().contains("setLastName")){ Constructor<Person> construcotr = personClass.getConstructor(null); Person toms = constructor.newInstance(null); method.invoke(toms,"toms"); } } for(Method method : declaredMethods){ //如要代用私有的方法需要开启, method.setAccessible(true); } }
-
获取属性
public void getVoid06(){ Class<Person> personClass = Person.class; //获取公开的 Field[] fields = personClass.getFields(); for(Field field : fields){ System.out.println("field = " + field); } //获取私有的 Field[] declareFields = personClass.getDeclareFields(); for(Field declareField : declareFields){ System.out.println("declareField = " + declareField); } }
-
eg:
public void getVoid07(){ ArrayList<String> strings = new ArrayList<>(); strings.add("小王"); Class<? extends ArrayList> aClass = strings.getClass(); Method add = aClass.getMethod("add",Object.class); add.invoke(strings,123456); System.out.println("strings = " + strings); }