写博客的心理
写了java这么久了,长时间不用都快忘了,笔记上都是知识点,操作性不强。写一个博客能够完整的总结这块的知识点,找起来也挺方便的。毕竟是个人总结,有错望指出,勿喷。。。
利用反射创建对象的重要性
正所谓无反射不框架,可以看出反射在java中的重要性不言而喻了。例如在Spring当中使用配置文件的方式来达到解耦合的效果,就是源于反射。可以通过读取配置文件,然后生成具体的类。
反射创建对象
直接使用newInstance()
编写创建对象的目标类
public class User {
//定义User的成员变量和以及get、set
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
//创建构造方法
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
}
获取Class,然后调用newInstance()方法生成对象
public static void main(String[] args) {
try {
//获取Class
Class uClass = User.class;
//调用newInstance()
User u = (User) uClass.newInstance();
u.setUsername("user");
u.setPassword("password");
System.out.println(u);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
注意
如果无参构造器私有化是会报错的
java.lang.IllegalAccessException: Class CreateObjectByReflect can not access a member of class User with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.Class.newInstance(Class.java:436)
at CreateObjectByReflect.main(CreateObjectByReflect.java:7)
反射利用构造方法
同样离不开Class,所以流程如下:
- 获取Class
- 获取构造方法
- 调用构造方法的newInstance()方法创建对象
public static void main(String[] args) {
Class uClass = User.class;
try {
//获取指定构造方法
Constructor con = uClass.getConstructor(new Class[] {String.class, String.class});
System.out.println(con);
//调用生成
User u = (User) con.newInstance(new Object[] {"user", "password"});
System.out.println(u);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
还是存在构造方法私有化后,就获取不到私有的构造方法,所以需要设置访问权限。
//获取指定构造方法
Constructor con = uClass.getDeclaredConstructor(new Class[] {String.class, String.class});
//设置访问权限
con.setAccessible(true);
User u = (User) con.newInstance(new Object[] {"user", "password"});
一定要使用getDeclaredConstructor获取,使用getConstructor获取不到私有的构造方法。