反射机制-new Instance()
反射机制获取到Class,作用:
- 通过Class的newInstance()方法来实例化对象。
- 注意:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。
public class ReflectTest02 { public static void main(String[] args) { // 以反射机制的方式创建对象。 try { // 通过反射机制,获取Class,通过Class来实例化对象 Class c = Class.forName("com.java.bean.User"); // c代表User类型。 // newInstance() 这个方法会调用User这个类的无参数构造方法,完成对象的创建。 // 重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的! Object obj = c.newInstance(); System.out.println(obj); // com.bjpowernode.java.bean.User@10f87f48 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }
user实例化对象
- 必须提供无参构造:否则反射calss会出现异常
public class User { public User(){ System.out.println("无参数构造方法!"); } // 定义了有参数的构造方法,无参数构造方法就没了。 public User(String s){ } }
Class.forName() :
- 如果希望一个类的静态代码块执行,其它代码一律不执行;
- 使用:Class.forName("完整类名"); 这个方法的执行会进行类加载,类加载时,静态代码块执行。
public class MyClass { // 静态代码块在类加载时执行,并且只执行一次。 static { System.out.println("MyClass类的静态代码块执行了!"); } }
public class ReflectTest04 { public static void main(String[] args) { try { // Class.forName()这个方法的执行会进行:类加载。 Class.forName("com.java.reflect.MyClass"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }