反射
一、什么是反射
- 在理解什么是反射之前我们需要了解什么是类型信息。
java让我们在运行时识别对象和类的信息,主要有两种方式,
-
传统的RTTI(Runtime Type Information:运行时类型信息),它假定我们在编译时就已经知道所有的类型信息。
-
反射机制:它允许我们在运行时发现和使用类的信息。
- java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的功能称为java语言的反射机制。(简而言之,反射就是把java类中的各种成分映射成一个个的java对象)
二、利用反射动态创建对象
- 获取class对象的三种方式
//创建一个user类
package com.etime;
public class User {
private String username;
private String usersex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsersex() {
return usersex;
}
public void setUsersex(String usersex) {
this.usersex = usersex;
}
public User() {
}
public User(String username, String usersex) {
this.username = username;
this.usersex = usersex;
}
@Override
public String toString() {
return "User [username=" + username + ", usersex=" + usersex + "]";
}
}
获取class对象的三种方式
package com.etime;
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象的三种方式
Class class1 = User.class;
System.out.println(class1);
//
User user = new User();
Class class2 =user.getClass();
System.out.println(class2);
Class class3 = Class.forName("com.etime.User");
System.out.println(class3);
}
}
-
动态创建对象
package com.etime; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class CreateInstance { public static void main(String[] args) { User user = new User(); Class class1 = user.getClass(); try { // 使用instance()创建对象 //注意要求Class对象对应类必须要有默认的构造器(无参数的构造方法) User obj = (User) class1.newInstance(); //利用反射调用方法 obj.setUsername("xxx"); obj.setUsersex("男"); System.out.println(obj.toString()); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用构造方法创建对象 try { Constructor constructor = class1.getConstructor(String.class, String.class); Object obj2 = constructor.newInstance("sz", "男"); System.out.println(obj2.toString()); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
三、动态操作属性(调用get、set)
package com.etime; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class CreateInstance { public static void main(String[] args) { User user = new User(); Class class1 = user.getClass(); try { // 使用instance创建对象 User obj = (User) class1.newInstance(); //利用反射调用方法 obj.setUsername("xxx"); obj.setUsersex("男"); System.out.println(obj.toString()); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用构造方法创建对象 try { Constructor constructor = class1.getConstructor(String.class, String.class); Object obj2 = constructor.newInstance("上致", "男"); System.out.println(obj2.toString()); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }